Как я могу сделать такой выбор:
SELECT *
FROM Street
WHERE StreetName LIKE IN ('% Main Street', 'foo %')
Пожалуйста, не говорите мне, что я могу использовать OR
, потому что это действительно происходит из запроса.
Как я могу сделать такой выбор:
SELECT *
FROM Street
WHERE StreetName LIKE IN ('% Main Street', 'foo %')
Пожалуйста, не говорите мне, что я могу использовать OR
, потому что это действительно происходит из запроса.
Нет комбинированного синтаксиса 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'
У вас здесь не так много вариантов.
SELECT * FROM Street Where StreetName LIKE '% Main Street' OR StreetName LIKE 'foo %'
Если это часть существующего, более сложного запроса (который является показом, которое я получаю), вы можете создать функцию значения таблицы, которая проверит вас.
SELECT * FROM Street Where StreetName IN (dbo.FindStreetNameFunction('% Main Street|foo %'))
Я бы рекомендовал использовать простейшее решение (первое). Если это вложено внутри более крупного и сложного запроса, опубликуйте его, и мы посмотрим.
Вы можете обратиться к 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 в другой таблице или вы можете собрать их через запрос, вы можете заменить это в строке (**)
Я считаю, что могу уточнить, что он ищет, но я не знаю ответа. Я буду использовать свою ситуацию для демонстрации. У меня есть таблица с столбцом под названием "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 пытается сделать что-то подобное.