如何检查SQL Server文本列是否为空?

213

我正在使用 SQL Server 2005。我有一张表,其中有一个文本列,该列有许多行的值不为null,但为空。尝试与''进行比较会得到以下响应:

在不等于运算符中,数据类型text和varchar不兼容。

是否有特殊函数可以确定文本列的值不为null但为空吗?


1
如有可能,我会将数据类型转换为varchar(max),因为文本已被弃用-最好现在开始进行更改,如果您正在操作表格。当然要先与您的数据库管理员核实。但是,在必须转换之前,尽可能多地进行转换,这是我的想法。这将取决于您有多少代码使用了像contains和write text这样的内容,是否需要立即执行此操作,但是我提出此问题,以便您知道这将需要最终更改。 - HLGEM
17个回答

341
where datalength(mytextfield)=0

4
这并不是实际问题,只是针对只读标题的人的提醒,请不要忘记在您的列可能为“NULL”时添加“OR mytextfield IS NULL”。 - Daan
5
mytextfield 为空 或者 :-) - ban-geoengineering
4
SQL Server T-SQL不支持短路求值技术,所以这里的顺序不会影响结果。 - Conrad

54
ISNULL(
case textcolum1
    WHEN '' THEN NULL
    ELSE textcolum1
END 
,textcolum2) textcolum1

以上查询实际上会处理文本列的空值和空字符串,并根据条件分配值。如果您认同这个答案,请点赞。谢谢。 - user_v

36

实际上,你只需要使用LIKE运算符。

SELECT * FROM mytable WHERE mytextfield LIKE ''

1
我更喜欢这个答案,因为它不依赖于调用SQL函数(如DataLength()、IsNull()或Cast())的额外开销。也许生成的查询计划是相同的(我没有检查);但我仍然认为这是一种更加干净的方法。 - MikeTeeVee

15

要仅获取空值(而非 null 值):

SELECT * FROM myTable WHERE myColumn = ''
获取null和空值:

要获取null和空值:

SELECT * FROM myTable WHERE myColumn IS NULL OR myColumn = ''

仅获取 null 值:

SELECT * FROM myTable WHERE myColumn IS NULL

获取除 null 和空值之外的数值:

SELECT * FROM myTable WHERE myColumn <> ''


请记住,仅在必要时使用LIKE短语,因为与其他类型的搜索相比,它们会降低性能。


你的意思不是 myColumn IS NOT NULL AND my column = ''; 吗? - bcsb1001

3
SELECT * FROM TABLE
WHERE ISNULL(FIELD, '')=''

1
已点赞,但是...如果你觉得即使字符串中有空格,“ ”也是一个空字符串,那么使用WHERE ISNULL(TRIM(Field), '') = ''会更好一些;-) - Kirsten
对于MySQL,正确的语法是: SELECT * FROM TABLE WHERE IFNULL(FIELD, '')='' - Cláudio Silva

2

使用IS NULL运算符:

Select * from tb_Employee where ename is null

1
atoumey在问题中指出:“该列的值不为空,但是为空”,因此ISNULL()无法起作用 :) - GazB

1

不要使用isnull,而是使用case,因为性能更好。

case when campo is null then '' else campo end

在您的问题中,您需要做到这一点:

case when campo is null then '' else
  case when len(campo) = 0 then '' else campo en
end

像这样的代码:
create table #tabla(
id int,
campo varchar(10)
)

insert into #tabla
values(1,null)

insert into #tabla
values(2,'')

insert into #tabla
values(3,null)

insert into #tabla
values(4,'dato4')

insert into #tabla
values(5,'dato5')

select id, case when campo is null then 'DATA NULL' else
  case when len(campo) = 0 then 'DATA EMPTY' else campo end
end
from #tabla

drop table #tabla

你首先要检查是否为空,然后使用len函数...希望能帮到你。 - Enrique Garcia
如果列不是NULL且为空,没有文本,该怎么办? - Sayed Muhammad Idrees
你是说空格吗?还是你的意思是什么? - Enrique Garcia

1

我知道这篇文章很古老,但我发现它很有用。

它没有解决我的问题,即返回具有非空文本字段的记录,因此我想添加我的解决方案。

这是对我有效的where子句。

WHERE xyz LIKE CAST('% %' as text)

1
使用 DATALENGTH 方法,例如:
SELECT length = DATALENGTH(myField)
FROM myTABLE

0

我想要在值为null或空时显示预定义文本(“无可用实验室”),我的朋友帮了我一个忙:

StrengthInfo = CASE WHEN ((SELECT COUNT(UnitsOrdered) FROM [Data_Sub_orders].[dbo].[Snappy_Orders_Sub] WHERE IdPatient = @PatientId and IdDrugService = 226)> 0)
                            THEN cast((S.UnitsOrdered) as varchar(50))
                    ELSE 'No Labs Available'
                    END

哇,一个子查询。这真的不贵。 - Jay Croghan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接