Страница 1 из 1
Поиск в строке в interbase
Добавлено: 21 мар 2011, 17:18
xtrustx
Есть две таблицы.
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 начал изучать совсем недавно)
Спасибо.
Re: поиск в строке в interbase
Добавлено: 23 мар 2011, 17:55
kdv
в InterBase - никак (кроме udf или явного прохода по записям с проверкой строк именно на ДВА символа). В Firebird 2.5 - теоретически возможно через регулярные выражения. Но в любом случае оптимизировать это не удастся, такой поиск будет сканировать все записи, в которых требуется проверять строки.
Re: Поиск в строке в interbase
Добавлено: 23 мар 2011, 22:36
xtrustx
выходит, только через udf. ну чтож, будем читать/просвящаться)
Re: Поиск в строке в interbase
Добавлено: 24 мар 2011, 01:01
kdv
ну, я как-то смутно представляю себе какое-то элементарное выражение для поиска двух (трех, пяти?) вхождений одной (двух, десяти?) букв в строке. Даже с использованием процедуры.
Re: Поиск в строке в interbase
Добавлено: 24 мар 2011, 02:38
hvlad
Re: Поиск в строке в interbase
Добавлено: 27 мар 2011, 00:23
xtrustx
А чем
КОД: ВЫДЕЛИТЬ ВСЁ
FIO LIKE '%a%a%'
не угодил ?
Например, тем, что в этом случае в нужный список войдут совсем ненужные фамилии с тремя(четырьмя, десятью?) буквами "а" в ФИО.
Re: Поиск в строке в interbase
Добавлено: 27 мар 2011, 01:32
hvlad
xtrustx писал(а):hvlad писал(а):А чем
не угодил ?
Например, тем, что в этом случае в нужный список войдут совсем ненужные фамилии с тремя(четырьмя, десятью?) буквами "а" в ФИО.
Т.е.
написать уж совсем никак...
Re: Поиск в строке в interbase
Добавлено: 27 мар 2011, 21:17
xtrustx
Т.е.
написать уж совсем никак...
В принципе можно, учитывая что в фио строка не такая большая. но это, как говорил мой преподаватель по программированию, - "дурной стиль")) представь, что у тебя имеется строка в 300 символов, и тебе нужно сделать что-то подобное - тогда конструкцию
Код: Выделить всё
AND FIO NOT LIKE '%a%a%a%' AND FIO NOT LIKE '%a%a%a%а%'
//и так далее
повторять неизвестное количество раз. код выходит массивным и не оптимальным. для хорошего стиля стоит, наверное, изучить udf функции, раз с length тут не получается придумать)
Вам спасибо.
Re: Поиск в строке в interbase
Добавлено: 28 мар 2011, 00:45
hvlad
xtrustx писал(а):представь, что у тебя имеется строка в 300 символов, и тебе нужно сделать что-то подобное - тогда конструкцию
Код: Выделить всё
AND FIO NOT LIKE '%a%a%a%' AND FIO NOT LIKE '%a%a%a%а%'
//и так далее
повторять неизвестное количество раз.
Причём тут длина строки и зачем "что-то повторять неизвестное количество раз" ???
Напомню, стояла задача посчитать "сотрудников с ФИО, содержащим две буквы "а""
Re: Поиск в строке в interbase
Добавлено: 28 мар 2011, 09:56
kdv
давайте я наконец озвучу факт, что постановка задачи явно дурацкая, по крайней мере без вменяемого объяснения. Ну вот кого может интересовать, что у меня в имени есть буква "р"? Разве что чудака-аналитика ФСБ. Всем остальным, например, ЖКХ, МТС, моим дистрибуторам, и даже паспортному столу на это должно быть просто наплевать. Более того, даже большинству из этого списка наплевать, как меня зовут, а не то что там есть какие-то буквы.
Re: Поиск в строке в interbase
Добавлено: 28 мар 2011, 10:18
hvlad
kdv писал(а):давайте я наконец озвучу факт, что постановка задачи явно дурацкая, по крайней мере без вменяемого объяснения. Ну вот кого может интересовать, что у меня в имени есть буква "р"?
Препа, кого-же ещё
Re: Поиск в строке в interbase
Добавлено: 28 мар 2011, 18:32
xtrustx
так. я теперь понял, где я был не прав и почему возникло недопонимание. я почему-то был уверен в том, что
заблочит "..с тремя символами "а"", но пропустит "..с четырьмя", но это естественно не так) если бы сразу понял эту тему, тогда бы и вопрос отпал)
крутое спасибо, вопрос закрыт)продолжу изучение дальше