将变量用作多个字符串的WHERE过滤器

时间:2017-11-03 10:39:05

标签: sql-server sql-server-2008 tsql

我有一个包含事件代码的字段,有时是两个,有时是3个。

列看起来像这样:

'3011, 6009'      
'3011, 3054'      
'3011, 3013'      
'6009, 9524'      
'3011, 9524'      
'3011, 6009, 3054'
'3011, 6009, 9524'
'3011, 9950'      
'6009, 9950'      

组合定义了某个组。

我想使用变量@x并设置值。到现在为止还挺好。

但我不确定如何在SELECT语句中使用该变量:

SELECT A, B, C
FROM TableA
WHERE EventCodes IN (@x)

任何人都可以指出引号在哪里,我找不到它。

2 个答案:

答案 0 :(得分:0)

IN子句需要一组元素。作为您的变量是一个带有元素串联的字符串,因此非常不同。

您可以按如下方式创建临时表:

CREATE TABLE #app
(id varchar(10))

INSERT INTO #app VALUES('3011,6009'),依此类推

然后,您可以重新编写查询,如下所示:

SELECT A, B, C
FROM TableA
WHERE EventCodes IN (SELECT id FROM #app)

SELECT A, B, C
FROM TableA
JOIN #app
    ON TableA.EventCode = #app.id

答案 1 :(得分:0)

如果您在2016年,则可以使用新的STRING_SPLIT功能。它将以逗号分隔的字符串并返回一个表,您可以在IN子句中使用该表。例如,

SELECT A, B, C
FROM   TableA
WHERE  EventCodes IN STRING_SPLIT(@X, ',')

如果你可以规范化你的桌子会更好。