首页 > 解决方案 > 如果其列包含列表中的任何值,则从结果中排除

问题描述

假设我有一个1通过id 的 SQL 表,30但我想从 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 语句的确切数字,我提供的数字是用于示例,但它可以是任何数字。

标签: sqlsql-server

解决方案


你可以这样写:

WHERE COL NOT IN (7, 10, 21)

如果你想传入一个字符串,那么你可以拆分它。在 SQL Server 2016+ 中,您可以使用string_split()(并且您可以SPLIT()在 Web 上获取早期版本的功能)。

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) 
             )

推荐阅读