Поиск в строке в interbase

Модераторы: kdv, CyberMax

Ответить
xtrustx
Сообщения: 5
Зарегистрирован: 21 мар 2011, 17:14

Поиск в строке в interbase

Сообщение xtrustx » 21 мар 2011, 17:18

Есть две таблицы.
1) Personal(personalid,fio,hiredate,sa lary..), где FIO char(50)
2)TRIP(tripid, tripnumb,week_day...), где WEEK_DAY char(11)
Нужно вывести минимум из двух: количество сотрудников с ФИО, содержащим две буквы "а" и количеством рейсов по понедельникам.

PHP код:

Код: Выделить всё

CREATE PROCEDURE "MINOFTWO" 
RETURNS
(
  "MNDTRIP" INTEGER,
  "FIOTRIP" INTEGER,
  "MINOFTHIS" INTEGER
)
AS
BEGIN
  SELECT COUNT(WEEK_DAY)
  FROM TRIP
  WHERE WEEK_DAY='понедельник'
  INTO :MNDTRIP;

  SELECT COUNT(FIO)
  FROM PERSONAL
  /*WHERE (LENGTH(FIO)-LENGTH(FIO NOT LIKE '%а%')=2)*/
  WHERE FIO LIKE '%а%' 
  INTO :FIOTRIP;

  IF (MNDTRIP<FIOTRIP) THEN
    BEGIN
    MINOFTHIS=MNDTRIP;
    END

  ELSE
    BEGIN
    MINOFTHIS=FIOTRIP;
    END
END  
Данный код выполняется, но в FIOTRIP суммируются все фио, где хотя бы раз встречается символ "а"
Проблема в том, что нужно сделать подобие следующего:

PHP код:
/*WHERE (LENGTH(FIO)-LENGTH(FIO NOT LIKE '%а%')=2)*/
,но я не могу найти в книгах по IB как использовать длину строк, чтобы оживить этот алгоритм)

SQL начал изучать совсем недавно)
Спасибо.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: поиск в строке в interbase

Сообщение kdv » 23 мар 2011, 17:55

в InterBase - никак (кроме udf или явного прохода по записям с проверкой строк именно на ДВА символа). В Firebird 2.5 - теоретически возможно через регулярные выражения. Но в любом случае оптимизировать это не удастся, такой поиск будет сканировать все записи, в которых требуется проверять строки.

xtrustx
Сообщения: 5
Зарегистрирован: 21 мар 2011, 17:14

Re: Поиск в строке в interbase

Сообщение xtrustx » 23 мар 2011, 22:36

выходит, только через udf. ну чтож, будем читать/просвящаться)

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Поиск в строке в interbase

Сообщение kdv » 24 мар 2011, 01:01

ну, я как-то смутно представляю себе какое-то элементарное выражение для поиска двух (трех, пяти?) вхождений одной (двух, десяти?) букв в строке. Даже с использованием процедуры.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Поиск в строке в interbase

Сообщение hvlad » 24 мар 2011, 02:38

А чем

Код: Выделить всё

FIO LIKE '%a%a%' 
не угодил ?

xtrustx
Сообщения: 5
Зарегистрирован: 21 мар 2011, 17:14

Re: Поиск в строке в interbase

Сообщение xtrustx » 27 мар 2011, 00:23

А чем
КОД: ВЫДЕЛИТЬ ВСЁ
FIO LIKE '%a%a%'
не угодил ?
Например, тем, что в этом случае в нужный список войдут совсем ненужные фамилии с тремя(четырьмя, десятью?) буквами "а" в ФИО.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Поиск в строке в interbase

Сообщение hvlad » 27 мар 2011, 01:32

xtrustx писал(а):
hvlad писал(а):А чем

Код: Выделить всё

FIO LIKE '%a%a%'
не угодил ?
Например, тем, что в этом случае в нужный список войдут совсем ненужные фамилии с тремя(четырьмя, десятью?) буквами "а" в ФИО.
Т.е.

Код: Выделить всё

AND FIO NOT LIKE '%a%a%a%'
написать уж совсем никак...

xtrustx
Сообщения: 5
Зарегистрирован: 21 мар 2011, 17:14

Re: Поиск в строке в interbase

Сообщение xtrustx » 27 мар 2011, 21:17

Т.е.

Код: Выделить всё

AND FIO NOT LIKE '%a%a%a%'
написать уж совсем никак...
В принципе можно, учитывая что в фио строка не такая большая. но это, как говорил мой преподаватель по программированию, - "дурной стиль")) представь, что у тебя имеется строка в 300 символов, и тебе нужно сделать что-то подобное - тогда конструкцию

Код: Выделить всё

AND FIO NOT LIKE '%a%a%a%' AND FIO NOT LIKE '%a%a%a%а%'
//и так далее  
повторять неизвестное количество раз. код выходит массивным и не оптимальным. для хорошего стиля стоит, наверное, изучить udf функции, раз с length тут не получается придумать)
Вам спасибо.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Поиск в строке в interbase

Сообщение hvlad » 28 мар 2011, 00:45

xtrustx писал(а):представь, что у тебя имеется строка в 300 символов, и тебе нужно сделать что-то подобное - тогда конструкцию

Код: Выделить всё

AND FIO NOT LIKE '%a%a%a%' AND FIO NOT LIKE '%a%a%a%а%'
//и так далее  
повторять неизвестное количество раз.
Причём тут длина строки и зачем "что-то повторять неизвестное количество раз" ???

Напомню, стояла задача посчитать "сотрудников с ФИО, содержащим две буквы "а""

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Поиск в строке в interbase

Сообщение kdv » 28 мар 2011, 09:56

давайте я наконец озвучу факт, что постановка задачи явно дурацкая, по крайней мере без вменяемого объяснения. Ну вот кого может интересовать, что у меня в имени есть буква "р"? Разве что чудака-аналитика ФСБ. Всем остальным, например, ЖКХ, МТС, моим дистрибуторам, и даже паспортному столу на это должно быть просто наплевать. Более того, даже большинству из этого списка наплевать, как меня зовут, а не то что там есть какие-то буквы.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Поиск в строке в interbase

Сообщение hvlad » 28 мар 2011, 10:18

kdv писал(а):давайте я наконец озвучу факт, что постановка задачи явно дурацкая, по крайней мере без вменяемого объяснения. Ну вот кого может интересовать, что у меня в имени есть буква "р"?
Препа, кого-же ещё :)

xtrustx
Сообщения: 5
Зарегистрирован: 21 мар 2011, 17:14

Re: Поиск в строке в interbase

Сообщение xtrustx » 28 мар 2011, 18:32

так. я теперь понял, где я был не прав и почему возникло недопонимание. я почему-то был уверен в том, что

Код: Выделить всё

FIO NOT LIKE '%а%а%а%'

заблочит "..с тремя символами "а"", но пропустит "..с четырьмя", но это естественно не так) если бы сразу понял эту тему, тогда бы и вопрос отпал)
крутое спасибо, вопрос закрыт)продолжу изучение дальше

Ответить