SQL Server 2014表指定列筛选不生效,T-SQL过滤空值/NULL语法问题排查
语法问题分析
- 逻辑运算符使用错误:你需要保留「非NULL且非空白」的记录,需要用
AND而非OR。当前OR逻辑只要满足任意一个条件就会返回记录,比如全空格的Email,DATALENGTH计算结果大于0,会直接满足第一个条件被返回,这是视觉空白记录被包含的核心原因。 - 未显式处理NULL值:SQL Server使用三值逻辑(TRUE/FALSE/UNKNOWN),当Email为NULL时,
DATALENGTH([Email])>0和[Email]<>' '的计算结果都是UNKNOWN,WHERE子句仅返回计算结果为TRUE的记录,未显式处理NULL会存在边界逻辑错误。 DATALENGTH无法区分有效内容和全空格内容:全空格字符串的DATALENGTH返回值大于0,但属于你需要排除的空白内容,原逻辑没有对空格做过滤。
正确实现写法
推荐兼容性最高的写法:
USE MyDatabase SELECT * FROM [t1] WHERE [Email] IS NOT NULL AND LTRIM(RTRIM([Email])) <> ''
该写法先通过IS NOT NULL显式排除NULL值,再通过LTRIM、RTRIM去除首尾空格后判断是否为空字符串,可以覆盖所有空白场景(空字符串、全空格字符串)。
如果要使用DATALENGTH实现,修正后写法如下:
USE MyDatabase SELECT * FROM [t1] WHERE [Email] IS NOT NULL AND DATALENGTH(LTRIM(RTRIM([Email]))) > 0
内容的提问来源于stack exchange,提问作者user3115933
相关产品推荐
相关产品推荐

