Как сделать динамический запрос SQL SELECT, передав список значений, разделенных запятыми?

У меня есть столбец в моей базе данных SQL (с использованием mySQL) «фамилия», в которой есть любое количество фамилий сотрудников. Я хочу написать запрос, который обрабатывает поиск фамилий, используя список с разделителями-запятыми.

Таким образом, пользователь наберет:

Garcia, Smith, Jones

И это сохраняется в строке lastNameQuery, которая затем передается в мою внутреннюю функцию API, которая вызывает команду SQL. Я хочу вернуть всех сотрудников в БД с этими фамилиями.

Есть ли какая-либо команда SQL SELECT, которую я могу использовать для поиска, используя такой список? Для других моих функций (которые обрабатывают только один поисковый запрос) я использую это:

"SELECT * FROM employees WHERE salary LIKE '%${salary}%'"

Который отлично работает. Есть ли способ изменить его для обработки списка? Я всегда могу разбить одну строку ("Garcia, Smith, Jones") на массив, если это необходимо, так что это не проблема. Есть идеи?

Вы можете преобразовать свой список, разделенный запятыми, во временную структуру таблицы или массив (однако MySql обрабатывает эти вещи), а затем использовать это в предложении соединения: select * from Employee join temp on Employee.LastName = temp.LastName). Вероятно, вы можете найти много обращений по теме «преобразование CSV в таблицу» для вашей базы данных.

topsail 22.11.2022 20:45
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
1
98
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно либо сделать:

(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? К сожалению, первое решение не сработает, поскольку его нельзя жестко запрограммировать, мне приходится динамически создавать строку в зависимости от поиска. Спасибо за помощь!!

TorusWithSprinkles 22.11.2022 23:58

имя столбца sql, которое у вас уже есть

ysth 23.11.2022 00:16

это сработало! Спасибо. Для тех, кто читает в поисках решения, полный оператор/решение SQL выглядит так: ALTER TABLE employees ADD FULLTEXT index_name(lastname); И SQL, вызываемый в коде, выглядит как SELECT * FROM employees WHERE MATCH(lastname) against(lastNameQuery); (где lastNameQuery — это список, разделенный запятыми).

TorusWithSprinkles 23.11.2022 03:42

о, извините, я не хотел оставлять имя таблицы вне таблицы изменений. имя индекса является необязательным, но его лучше указать, так как оно заменит вас, если вы не укажете.

ysth 23.11.2022 09:08

Другие вопросы по теме