Выбор нескольких значений в операторе Like

У меня стол SW_TBL_KEYWORD

Keyword       
-------
 ATOP
 APMT
 RSND

Это мой тестовый запрос

DECLARE @string NVARCHAR(MAX)
SELECT @string = 'ATOP,APMT'  

SELECT * 
FROM SW_TBL_KEYWORD 
WHERE Keyword LIKE @string 

поэтому мне нужно передать эти несколько значений, которые поступают из бэкэнда, в оператор like. Тестовый запрос не работает.

ПОМОЩЬ!!!

можно попробовать что-нибудь вроде stackoverflow.com/questions/1127088/mysql-like-in

Suresh Kamrushi 20.07.2018 07:22

Вы уверены, что используете mysql? Похоже на код sqlserver.

Susang 20.07.2018 07:25

@Susang Да, это похоже на SQL Server. Ой.

Tim Biegeleisen 20.07.2018 07:28

да, я редактировал. его сервер sql

Aayush Rajopadhyaya 20.07.2018 07:33

Какую версию sqlserver вы используете ??

Susang 20.07.2018 07:42

Sql Server 2014 версии 12.0

Aayush Rajopadhyaya 20.07.2018 08:20
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
6
80
3

Ответы 3

как вы это пробовали, работает только с функцией Mysql "IN"!

Это означает, что вы должны делать это как

select * from SW_TBL_KEYWORD where Keyword like "ATOP" OR Keyword LIKE "APMT"..

также следует упомянуть, что вы можете использовать% до, после или до и после, например,

select * from SW_TBL_KEYWORD where Keyword like "%TO%" 

также выдаст вам результат "ATOP" ..

Поэтому, если вы хотите найти более одного слова, вам придется строить свой запрос в зависимости от количества слов!

Я не знаю точно, как вы получаете свои условия поиска, но если вы разделите их знаком ",", вы можете взорвать это, а затем изучить его и создать свой запрос!

значения являются динамическими, поступают из раскрывающегося списка, это всего лишь тест, и его запрос к серверу sql, плохо, я добавил mysql в качестве тега .. Я фактически передал несколько значений параметру из раскрывающегося списка, теперь мне нужно использовать как оператор или любой другой соответствующий для выполнения запроса. помощь!

Aayush Rajopadhyaya 20.07.2018 07:40

и да, я хотел бы упомянуть, я использовал функцию Replace для итерации, но безрезультатно.

Aayush Rajopadhyaya 20.07.2018 08:35

Вы просто замените like @string на REGXP REPLACE(@string, ",", "|"), чтобы достичь того, чего хотите

select * from SW_TBL_KEYWORD where Keyword REGXP REPLACE(@string, ",", "|")

Вопрос касается SQL Server (СУБД Microsoft) - у которого НЕТ есть оператор / функция REGXP

marc_s 20.07.2018 08:41

@marc_s Исходный вопрос был помечен тегом MySQL. Я удалю это сейчас.

Tim Biegeleisen 20.07.2018 08:43

ПОПРОБУЙ ЭТО: для постоянного и гибкого решения

Создайте функцию Split, чтобы выполнить это требование и также использовать в будущем.

CREATE FUNCTION dbo.Split(@sep char(1), @s varchar(512))
RETURNS table
AS
RETURN (
    WITH Pieces(pn, start, stop) AS (
      SELECT 1, 1, CHARINDEX(@sep, @s)
      UNION ALL
      SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
      FROM Pieces
      WHERE stop > 0
    )
    SELECT pn,
      SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
    FROM Pieces
  )

Ваша таблица и ценности

DECLARE @SW_TBL_KEYWORD TABLE(Keyword VARCHAR(500))
INSERT INTO @SW_TBL_KEYWORD VALUES
('ATOP'),
('APMT'),
('RSND')

Логика для достижения ваших требований

DECLARE @string VARCHAR(MAX)
SELECT @string='ATOP,APMT' 

Разделите значение, разделенное запятыми, используя функцию, которую вы создали, и сохраните в переменной таблицы или во временной таблице.

DECLARE @tmp_filter TABLE(keyword VARCHAR(500))
INSERT INTO @tmp_filter
SELECT s FROM dbo.Split(',', @string)

Присоединитесь к таблице фильтров с фактической таблицей, используя Like, но после просмотра вашего фильтра и фактических значений я думаю, вам нужно точное совпадение, а не частичное использование like

SELECT t1.*
FROM @SW_TBL_KEYWORD t1 
INNER JOIN @tmp_filter t2 ON t1.Keyword LIKE ('%' + t2.keyword + '%')

Для точного совпадения мы можем изменить соединение с помощью строки ниже

INNER JOIN @tmp_filter t2 ON t1.Keyword = t2.keyword

ПРИМЕЧАНИЕ: это долгосрочное решение и полезно для других подобных задач. Если вы использовали SQLSERVER2016 or newest, тогда вы можете использовать функцию STRING_SPLIT вместо создания пользовательской функции.

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