在mssql数据库的实际使用中,text和ntext类型常被用来存储长文本备注信息,这类字段的空值判断和普通数值、字符串类型字段存在差异,很多开发者直接用等于空字符串的方式查询会得不到预期结果,需要掌握针对性的判断方法。

text和ntext类型空值的两种形式
mssql中text和ntext类型的空值分为两种情况,查询时需要同时覆盖才能拿到完整结果:
- 字段值为NULL,即没有给该字段赋值,属于数据库层面的空值
- 字段值为空字符串,即赋值了但内容为空,属于内容层面的空值
基础查询方法
仅查询NULL值的记录
如果只是需要筛选字段完全没有赋值的记录,直接使用IS NULL判断即可,和普通字段的NULL判断逻辑一致。
-- 查询test表中remark字段为NULL的记录,remark为text类型 SELECT * FROM test WHERE remark IS NULL;
仅查询空字符串的记录
text和ntext类型不能直接用等于号判断空字符串,需要使用DATALENGTH函数,当字段值为空字符串时,DATALENGTH返回0。
-- 查询test表中remark字段为空字符串的记录 SELECT * FROM test WHERE DATALENGTH(remark) = 0;
同时查询两种空值的完整方法
实际业务中通常需要把两种空值情况都筛选出来,可以用OR连接两个条件,也可以合并判断逻辑。
-- 方法1:用OR连接两个条件 SELECT * FROM test WHERE remark IS NULL OR DATALENGTH(remark) = 0; -- 方法2:合并判断,DATALENGTH对NULL值也会返回NULL,所以加IS NULL判断 SELECT * FROM test WHERE ISNULL(DATALENGTH(remark), 0) = 0;
注意事项
- 不要尝试用
remark = ''判断text和ntext类型的空字符串,mssql不支持这种写法,会直接报错 - 如果字段是后来修改为varchar(max)或者nvarchar(max)类型,空值判断逻辑和普通字符串类型一致,可以直接用
remark = ''或者remark IS NULL - 查询大量数据时,DATALENGTH函数不会走索引,如果这类查询频繁使用,建议考虑将字段类型迁移到max类型,或者增加冗余标识字段标记空值状态
示例表结构参考
以下是本文示例用到的test表结构,方便开发者对照测试:
-- 创建测试表
CREATE TABLE test (
id INT IDENTITY(1,1) PRIMARY KEY,
name NVARCHAR(50),
remark TEXT -- ntext类型将TEXT替换为NTEXT即可
);
-- 插入测试数据,包含NULL、空字符串、有内容的三种情况
INSERT INTO test (name, remark) VALUES ('张三', NULL);
INSERT INTO test (name, remark) VALUES ('李四', '');
INSERT INTO test (name, remark) VALUES ('王五', '这是一条备注内容');