sql-server - 如何在 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')
解决方案
您不能在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');
推荐阅读
- java - Thymeleaf:将 webjar CSS 文件的内容插入样式标签
- python - 不活动期后的表现
- google-compute-engine - 多区域共享 vpc gke 服务的内部负载均衡器
- sql - SQL 全选 Where 记录不存在
- android - Cordova (Android Plugin) - 将数据从主活动发送到 InAppBrowser
- image - Unity Button.Image.Color 不会“刷新”
- python - 尝试将 Windows 上的 Spyder 连接到远程 python 内核时访问被拒绝错误
- android - 如何在 ViewModel 中保存图像以处理方向变化?
- visual-studio - Visual Studio 32 位链接器如何找到 64 位链接器?
- php - 替换已弃用的 PodioContact 操作 API