如果结果的列包含列表中的任何值,则从结果中排除

时间:2019-05-01 11:53:00

标签: sql sql-server

让我们说我有一个SQL表,其ID为130,但我想从sql中排除数字7,10,21。

我如何在不编写类似代码的情况下做到这一点

SELECT * 
FROM TBL 
WHERE COL <> '7' AND COL <> '10' AND COL <> '21'

但是,相反,写类似

SELECT * 
FROM TBL 
WHERE COL NOT IN (@IDS)

尝试该示例时,如果@IDS等于一个数字,则有效,但如果等于多个数字,则显示所有记录。

要弄清楚它必须是数字列表的原因,是将其传递给SQL的方式。我无法更改数据的传递方式。

要澄清更多,因为我应该在原始问题中说过。我不知道要传递到SQL语句中的确切数字,我提供的数字仅用于示例,但是它可以是任何数字。

1 个答案:

答案 0 :(得分:3)

您可以这样写:

WHERE COL NOT IN (7, 10, 21)

如果要传递字符串,则可以将其拆分。在SQL Server 2016+中,您使用string_split()(对于Web上的早期版本,您可以获得SPLIT()函数)。

WHERE COL NOT IN (SELECT * FROM STRING_SPLIT('7,10,21'))

请注意,这会将字符串转换为整数,这可能会阻止使用索引。所以:

WHERE COL NOT IN (SELECT CONVERT(INT, value) FROM STRING_SPLIT('7,10,21'))

NOT EXISTS

WHERE EXISTS (SELECT 
              FROM STRING_SPLIT('7,10,21')
              WHERE ?.COL = TRY_CONVERT(INT, value) 
             )