У меня есть столбец в моей базе данных SQL (с использованием mySQL) «фамилия», в которой есть любое количество фамилий сотрудников. Я хочу написать запрос, который обрабатывает поиск фамилий, используя список с разделителями-запятыми.
Таким образом, пользователь наберет:
Garcia, Smith, Jones
И это сохраняется в строке lastNameQuery
, которая затем передается в мою внутреннюю функцию API, которая вызывает команду SQL. Я хочу вернуть всех сотрудников в БД с этими фамилиями.
Есть ли какая-либо команда SQL SELECT, которую я могу использовать для поиска, используя такой список? Для других моих функций (которые обрабатывают только один поисковый запрос) я использую это:
"SELECT * FROM employees WHERE salary LIKE '%${salary}%'"
Который отлично работает. Есть ли способ изменить его для обработки списка? Я всегда могу разбить одну строку ("Garcia, Smith, Jones"
) на массив, если это необходимо, так что это не проблема. Есть идеи?
Вам нужно либо сделать:
(lastname like '%Garcia%' or lastname like '%Smith%' or lastname like '%jones%')
или создайте полнотекстовый индекс по фамилии (alter table employess add fulltext (lastname)
), который позволит вам сделать
match (lastname) against ('Garcia, Smith, Jones')
но не будет делать такие вещи, как поиск Гарсии, если вы ищете только «Гарк».
Для этого полнотекстового решения ваша команда SQL (alter table add fulltext (lastname)
) lastname
ссылается только на имя столбца SQL, которое у меня уже есть? Или вы имели в виду, что это строка lastNameQuery? К сожалению, первое решение не сработает, поскольку его нельзя жестко запрограммировать, мне приходится динамически создавать строку в зависимости от поиска. Спасибо за помощь!!
имя столбца sql, которое у вас уже есть
это сработало! Спасибо. Для тех, кто читает в поисках решения, полный оператор/решение SQL выглядит так: ALTER TABLE employees ADD FULLTEXT index_name(lastname);
И SQL, вызываемый в коде, выглядит как SELECT * FROM employees WHERE MATCH(lastname) against(lastNameQuery);
(где lastNameQuery
— это список, разделенный запятыми).
о, извините, я не хотел оставлять имя таблицы вне таблицы изменений. имя индекса является необязательным, но его лучше указать, так как оно заменит вас, если вы не укажете.
Вы можете преобразовать свой список, разделенный запятыми, во временную структуру таблицы или массив (однако MySql обрабатывает эти вещи), а затем использовать это в предложении соединения:
select * from Employee join temp on Employee.LastName = temp.LastName)
. Вероятно, вы можете найти много обращений по теме «преобразование CSV в таблицу» для вашей базы данных.