首页 > 解决方案 > 如何在 T-SQL 中使用带通配符的 IN/NOT IN 运算符?

问题描述

我想检查一个变量的值是否像其他几个值一样(类似于 SQL 的 LIKE 运算符)。例如,我希望下面会打印valid. 但事实并非如此。被比较的值列表中是否允许使用通配符?

declare @var nvarchar(50) = 'SPARK'

IF (UPPER(TRIM(@var)) NOT IN ('%SQL%', '%SERVER%', '%PAR%'))
    print('invalid')
else
    print('valid')

标签: sql-servertsql

解决方案


您不能在IN子句中使用通配符。NOT IN ('%SQL%', '%SERVER%', '%PAR%')将检查该值是否这些值之一,因此您的值'SPARK'与最后一个值不匹配,'%PAR%'. 实际上 aNOT IN在后台被解析,如下所示:

@VAR != '%SQL%' AND @VAR != '%SERVER%' AND @VAR != '%PAR%'

这就是为什么NULL值在 a 中给出“意外”结果NOT IN!= NULL结果为 UNKNOWN,因此该子句解析为 UNKNOWN,这不是TRUE。

但是,一种解决方法是使用 a EXISTS(或在本例中为 a NOT EXISTS):

DECLARE @var nvarchar(50) = N'SPARK';

IF NOT EXISTS (SELECT 1 FROM(VALUES(N'SQL'),(N'SERVER'),(N'PAR'))V(S) WHERE @VAR LIKE CONCAT(N'%',V.S,N'%'))
    PRINT('invalid');
ELSE
    PRINT('valid');

推荐阅读