Задайте переменную с несколькими значениями и используйте IN
Возможный дубликат:
Параметрирование предложения SQL IN?
В SQL Server я хотел бы сделать что-то с этим...
DECLARE @Values varchar(1000)
SET @Values = 'A, B, C'
SELECT
blah
FROM
foo
WHERE
myField IN (@Values)
Возможно ли это или как это сделать?
Ответы
Ответ 1
Вам нужна переменная таблицы:
declare @values table
(
Value varchar(1000)
)
insert into @values values ('A')
insert into @values values ('B')
insert into @values values ('C')
select blah
from foo
where myField in (select value from @values)
Ответ 2
В идеале вам вообще не следует разбивать строки в T-SQL.
Запретив это изменение, в более старых версиях до SQL Server 2016 создайте функцию разделения:
CREATE FUNCTION dbo.SplitStrings
(
@List nvarchar(max),
@Delimiter nvarchar(2)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN ( WITH x(x) AS
(
SELECT CONVERT(xml, N'<root><i>'
+ REPLACE(@List, @Delimiter, N'</i><i>')
+ N'</i></root>')
)
SELECT Item = LTRIM(RTRIM(i.i.value(N'.',N'nvarchar(max)')))
FROM x CROSS APPLY x.nodes(N'//root/i') AS i(i)
);
GO
Теперь вы можете сказать:
DECLARE @Values varchar(1000);
SET @Values = 'A, B, C';
SELECT blah
FROM dbo.foo
INNER JOIN dbo.SplitStrings(@Values, ',') AS s
ON s.Item = foo.myField;
В SQL Server 2016 или более LTRIM()
версии (или в базе данных SQL Azure) это намного проще и эффективнее, однако вам нужно вручную применять LTRIM()
чтобы убрать все начальные пробелы:
DECLARE @Values varchar(1000) = 'A, B, C';
SELECT blah
FROM dbo.foo
INNER JOIN STRING_SPLIT(@Values, ',') AS s
ON LTRIM(s.value) = foo.myField;
Ответ 3
Используйте таблицу Temp или переменную таблицы, например
select 'A' as [value]
into #tmp
union
select 'B'
union
select 'C'
а затем
SELECT
blah
FROM foo
WHERE myField IN (select [value] from #tmp)
или
SELECT
f.blah
FROM foo f INNER JOIN #tmp t ON f.myField = t.[value]