Подтвердить что ты не робот

Комбинация "LIKE" и "IN" с использованием t-sql

Как я могу сделать такой выбор:

SELECT * 
FROM Street 
WHERE StreetName LIKE IN ('% Main Street', 'foo %')

Пожалуйста, не говорите мне, что я могу использовать OR, потому что это действительно происходит из запроса.

4b9b3361

Ответ 1

Нет комбинированного синтаксиса LIKE и IN, но вы можете использовать LIKE to JOIN в свой запрос, как показано ниже.

;WITH Query(Result) As
(
SELECT '% Main Street' UNION ALL
SELECT 'foo %'
)
SELECT DISTINCT s.* 
FROM Street s
JOIN Query q ON StreetName LIKE q.Result

Или использовать свой пример в комментариях

SELECT DISTINCT s.* 
FROM Street s
JOIN CarStreets cs ON s.StreetName LIKE cs.name + '%'
WHERE cs.Streets = 'offroad'

Ответ 2

У вас здесь не так много вариантов.

SELECT * FROM Street Where StreetName LIKE '% Main Street' OR StreetName LIKE 'foo %'

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

SELECT * FROM Street Where StreetName IN (dbo.FindStreetNameFunction('% Main Street|foo %'))

Я бы рекомендовал использовать простейшее решение (первое). Если это вложено внутри более крупного и сложного запроса, опубликуйте его, и мы посмотрим.

Ответ 3

Вы можете обратиться к Dynamic SQL и обернуть все в хранимой процедуре.

Если вы получите параметр LIKE IN в строке в качестве токенов с определенным разделителем, например

'% Main Street,foo %,Another%Street'

сначала вам нужно создать функцию, которая получает список LIKE "токенов" и возвращает их таблицу.

CREATE FUNCTION [dbo].[SplitList]
(
  @list nvarchar(MAX),
  @delim nvarchar(5)
)  
RETURNS @splitTable table 
(       
  value nvarchar(50)
) 
AS BEGIN
  While (Charindex(@delim, @list)>0) Begin 
    Insert Into @splitTable (value)
      Select ltrim(rtrim(Substring(@list, 1, Charindex(@delim, @list)-1))) 
    Set @list = Substring(@list, Charindex(@delim, @list)+len(@delim), len(@list))
  End     
  Insert Into @splitTable (value) Select ltrim(rtrim(@list))
  Return
END 

Затем в SP у вас есть следующий код

declare 
  @sql nvarchar(MAX),
  @subWhere nvarchar(MAX)
  @params nvarchar(MAX)

-- prepare the where sub-clause to cover LIKE IN (...)
-- it will actually generate where sub clause StreetName Like option1 or StreetName Like option2 or ...   
set @subWhere = STUFF(
  (
    --(**)
    SELECT ' OR StreetName like ''' + value + '''' FROM SplitList('% Main Street,foo %,Another%Street', ',') 
      FOR XML PATH('')
  ), 1, 4, '')

-- create the dynamic SQL
set @sql ='select * from [Street]
  where 
    (' + @subWhere + ')
    -- and any additional query params here, if needed, like
    AND StreetMinHouseNumber = @minHouseNumber
    AND StreetNumberOfHouses between (@minNumberOfHouses and @maxNumberOfHouses)'

set @params = ' @minHouseNumber nvarchar(5),
  @minNumberOfHouses int,
  @minNumberOfHouses int'     

EXECUTE sp_executesql @sql, @params,    
  @minHouseNumber,
  @minNumberOfHouses,
  @minNumberOfHouses     

Конечно, если у вас есть параметры LIKE IN в другой таблице или вы можете собрать их через запрос, вы можете заменить это в строке (**)

Ответ 4

Я считаю, что могу уточнить, что он ищет, но я не знаю ответа. Я буду использовать свою ситуацию для демонстрации. У меня есть таблица с столбцом под названием "Query", который содержит SQL-запросы. Эти запросы иногда содержат имена таблиц из одной из моих баз данных. Мне нужно найти все строки запроса, содержащие имена таблиц из конкретной базы данных. Поэтому для получения имен таблиц я могу использовать следующий код:

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

Я пытаюсь использовать предложение WHERE IN для определения строк запроса, которые содержат имена таблиц, которые меня интересуют:

SELECT *
  FROM [DatasourceQuery]
 WHERE Query IN LIKE
(
    SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
)

Я считаю, что OP пытается сделать что-то подобное.