Иногда нужно искать запись в базе Firebird по определённому параметру. Вы можете вытащить все записи, а потом при помощи цикла foreach или функции array_map() перебрать все элементы массива. Этот способ довольно сложный, но выполнимый. Вы хорошо нагрузите сервер и ваш скрипт будет работать внушительное время если количество таблиц несколько тысяч. Есть способ который ускорит работу вашего скрипта. Вам придется использовать для поиска в базе либо регулярные выражения, либо специальные условия. В таблицах базы очень часто строки содержат заглавные буквы. Egor@yandex.ru и egor@yandex.ru - это 2 разные строки с точки зрения SQL-языка Firebird. Для таких строк применяйте функцию UPPER().
//регистрозависимый оператор LIKE
SELECT * FROM USER u WHERE u.LAST_NAME LIKE '%egor%'
//регистронезависимый поиск
WHERE UPPER(NAME) = UPPER(:FIT_NAME)
ORDER BY NAME COLLATE PXW_CYRL
Допустим вы ищите логин пользователя и часть этого логина содержится в его email. Часть строки egor@yandex.ru до @ является логином. Как забрать эту часть из строки? Вы можете разбить строку по разделителю (@) или удалить часть строки, отсчитав некоторое число символов от конца строки.
Если вам нужно найти все комментарии одного пользователя, то используйте STARTING (начинается с). Когда известен логин вашего пользователя, то ищите записи полю email (логин@yandex.ru).
#если начинается с Jo
SELECT LAST_NAME, FIRST_NAME
FROM EMPLOYEE
WHERE UPPER(EMAIL) STARTING WITH 'Egor'
#регистрозависимый поиск
SELECT SHOP_NAME
FROM SHOP
WHERE SHOP_NAME STARTING WITH 'Ма'
Вы можете в качестве регистронезависимого поиска использовать переменную CONTAINING.
#поиск в дате
SELECT *
FROM SHOP
WHERE LAST_CHANGE CONTAINING 28;
#поиск по дате, которая не содержит 28
SELECT *
FROM SHOP
WHERE LAST_CHANGE NOT CONTAINING 28;
Регулярные выражения помогут вам найти записи по по кусочкам.
#регулярное выражение, пропуск букв 'й' и 'о'
SELECT *
FROM SHOP
WHERE SHOP_NAME SIMILAR TO 'Ма%к%п';
Если одна буква в строке 'Майкккоп' повторяется в больше 2 раз, то условие 'Май[к]оп' сработает.
#1 параметр (повторяющийся)
SELECT *
FROM SHOP
WHERE SHOP_NAME SIMILAR TO 'Май[к]оп';
Поиск по базе сработает если будут 2 параметра в условии Ма[йк][йк]оп. Между [][] будет регулярное выражение.
#два параметра
SELECT *
FROM SHOP
WHERE SHOP_NAME SIMILAR TO 'Ма[йк][йк]оп';
Поиск по 4 параметрам. Если в строке будут 4 совпадения то произойдёт выборка из базы.
#выражение для 4 букв
SELECT *
FROM SHOP
WHERE SHOP_NAME SIMILAR TO 'М[а-я][а-я][а-я][а-я]п';
Хорошо работают идентификаторы класса символа.
/*Латинские буквы a...x и A...Z.
С регистро-нечувствительными сортировками
этот класс также включает подч?ркнутые символы*/
[:ALPHA:]
#Десятичные цифры 0...9.
[:DIGIT:]
#Объединение [:ALPHA:] и [:DIGIT:].
[:ALNUM:]
/*Прописные (в верхнем регистре) латинские буквы A...Z.
Также включает в себя нижний регистр при регистро-
нечувствительных сортировках и подч?ркнутые символы
при регистро-нечувствительных сортировках.*/
[:UPPER:]
/*Строчные (в нижнем регистре) латинские буквы a...z.
Также включает в себя нижний регистр при регистро-
нечувствительных сортировках и подч?ркнутые символы
при регистро-нечувствительных сортировках.*/
[:LOWER:]
#Символ пробела (ASCII 32).
[:SPACE:]
/*Вертикальная табуляции (ASCII 9), перевод строки (ASCII 10),
горизонтальная табуляция (ASCII 11), разрыв страницы (ASCII 12),
возврат каретки (ASCII 13) и пробел (ASCII 32).*/
[:WHITESPACE:]
Бывает так что в строке элементы могут появляться, а могут и не появляться. Вам не нужно делать два лишних запроса, а потом обрабатывать их средствами PHP.
#может быть а может не быть
SELECT *
FROM SHOP
WHERE SHOP_NAME SIMILAR TO 'Майкоо?п';
Совпадений в строке может быть много. Очень часто создают подобные значения action_delete. Например, action__delete уже совсем другое значение. 'action_*' не будет учитывать количество '_' символов при поиске.
#совпадение 0 или более раз одного символа
SELECT *
FROM SHOP
WHERE SHOP_NAME SIMILAR TO 'Майкоо*п';
#совпадение 0 или более раз разных строковых символов
SELECT *
FROM SHOP
WHERE SHOP_NAME SIMILAR TO 'Майко[а-я]*п';
#совпадение 1 и более раз
SELECT *
FROM SHOP
WHERE SHOP_NAME SIMILAR TO 'Майко{1}п';
#совпадение от 1 до 3 раз и более
SELECT *
FROM SHOP
WHERE SHOP_NAME SIMILAR TO 'Майко{1,3}п';
Допустим у вас 2 условия и 3 условия не дано. Символ '|' разделяет 2 условия.
#1 условие | 2 условие
SELECT *
FROM SHOP
WHERE SHOP_NAME SIMILAR TO 'Майкоп|Ростов';
#буквы в условии могут менять положение
SELECT *
FROM SHOP
WHERE SHOP_NAME SIMILAR TO 'Ма(й|к)(й|к)оп';