Функция MySQL FIND_IN_SET ()
Функция FIND_IN_SET ()
MySQL FIND_IN_SET () возвращает позицию строки, если она присутствует (как подстрока) в списке строк. Сам список строк представляет собой строку, содержащую подстроки, разделенные символом ',' (запятая).
Эта функция возвращает 0, если строка поиска не существует в списке строк, и возвращает NULL, если один из аргументов равен NULL.
Синтаксис:
FIND_IN_SET (строка поиска, список строк)
аргументы
название | Описание |
---|---|
строка поиска | Строка, которую нужно искать в следующем списке аргументов. |
список строк | Список строк для поиска, если они содержат строку поиска. |
Синтаксическая диаграмма:
Версия MySQL: 5.6
Видео презентация
Иллюстрированная презентация
Пример: функция FIND_IN_SET ()
Следующая инструкция MySQL находит строку поиска 'ank' на втором месте в списке строк. Так что возвращается 2.
Код:
SELECT FIND_IN_SET('ank','b,ank,of,monk');
Пример вывода:
mysql> SELECT FIND_IN_SET ('ank', 'b, ank, of, monk'); + ------------------------------------ + | FIND_IN_SET ('ank', 'b, ank, of, monk') | + ------------------------------------ + | 2 | + ------------------------------------ + 1 ряд в наборе (0,00 сек)
Пример: MySQL FIND_IN_SET с WHERE CLAUSE
Следующая инструкция MySQL находит строку поиска в виде первых 7 символов из столбца aut_name автора таблицы в указанной строке, как указано в аргументе, и извлекает все столбцы из соответствующих строк.
Код:
SELECT *
FROM author
WHERE FIND_IN_SET(left(aut_name,7),'William,steven,jung,angalo')>0;
Пример таблицы: автор
Пример вывода:
+ -------- + ----------------- + --------- + ----------- + | aut_id | aut_name | страна | home_city | + -------- + ----------------- + --------- + ----------- + | AUT001 | Уильям Нортон | Великобритания | Кембридж | | AUT002 | Уильям Моэм | Канада | Торонто | | AUT003 | Уильям Энтони | Великобритания | Лидс | + -------- + ----------------- + --------- + ----------- + 3 ряда в наборе (0,13 сек)
Разница между функцией LOCATE () и FIND_IN_SET ()
При использовании функции LOCATE () для целых чисел, предположим, что нам нужно 1 для возврата из LOCATE (), если целое число 3 находится в наборе '1,2,3,4,5, ..', можно написать следующие команды MySQL:
Код:
SELECT IF(LOCATE(3,'1,2,3,4,5,6,7,8,9')>0,1,0);
Пример вывода:
mysql> SELECT IF (LOCATE (3, '1,2,3,4,5,6,7,8,9')> 0,1,0); + ----------------------------------------- + | IF (LOCATE (3, '1,2,3,4,5,6,7,8,9')> 0,1,0) | + ----------------------------------------- + | 1 | + ----------------------------------------- + 1 ряд в наборе (0,06 сек)
Вышеприведенная команда работает правильно, потому что набор содержит число 3, но если мы напишем следующие команды, посмотрим, что произошло -
Код:
SELECT IF(LOCATE(3,'11,12,13,14,15')>0,1,0);
Пример вывода:
mysql> SELECT IF (LOCATE (3, '11, 12,13,14,15 ')> 0,1,0); + -------------------------------------- + | IF (LOCATE (3, '11, 12,13,14,15 ')> 0,1,0) | + -------------------------------------- + | 1 | + -------------------------------------- + 1 ряд в наборе (0,02 сек)
Здесь мы видим из приведенного выше примера, что 3 не представлен как число три (3) в данном наборе, хотя LOCATE () возвращает 1, потому что LOCATE () рассматривает данный набор как строку, но не как значение, разделенное запятыми, и 3 присутствующих в номере 13.
Чтобы избежать такой ситуации, вы можете использовать функцию FIND_IN_SET (). Вот пример ниже -
Код:
SELECT IF(FIND_IN_SET(3,'11,12,13,4,5,6,7,8,9')>0,1,0);
Пример вывода:
mysql> SELECT IF (FIND_IN_SET (3, '11, 12,13,4,5,6,7,8,9 ')> 0,1,0); + ------------------------------------------------- + | IF (FIND_IN_SET (3, '11, 12,13,4,5,6,7,8,9 ')> 0,1,0) | + ------------------------------------------------- + | 0 | + ------------------------------------------------- + 1 ряд в наборе (0,05 сек)
Таким образом, функция LOCATE () очень подходит для строки, но не настолько подходит для целых чисел.
Все строковые функции
Новый контент: Composer: менеджер зависимостей для PHP , R программирования