如何在SQL Server中检查是否为非空字符串?

347

如何在 SQL Server 中检查一个 WHERE 条件中的列是否不为空并且不是空字符串 ('')?

10个回答

477

如果您只想匹配 "" 作为空字符串

WHERE DATALENGTH(COLUMN) > 0 

如果您希望将仅由空格组成的任何字符串视为空,则可以这样计算。
WHERE COLUMN <> '' 

当在 WHERE 子句中使用时,这两者都不会返回 NULL 值。因为对于这些情况,NULL 会被评估为 UNKNOWN 而不是 TRUE

CREATE TABLE T 
  ( 
     C VARCHAR(10) 
  ); 

INSERT INTO T 
VALUES      ('A'), 
            (''),
            ('    '), 
            (NULL); 

SELECT * 
FROM   T 
WHERE  C <> ''

仅返回单行 A。也就是说,此查询将排除值为 NULL、空字符串或完全由空格组成的字符串的行。

SQL Fiddle


6
为什么不用 WHERE COALESCE(column, '') <> '' - Lieven Keersmaekers
12
如果“列”有索引,那么您的查询可能不会使用它。 - Lamak
我不确定,但如果你写 WHERE COL<>'',这可能会导致表扫描而不是查找。 - mr R
@mr R - 不正确 - SQL Server可以使用两个范围谓词进行查找。< ''> '' - 但是,除非有大量带有空字符串值的行,否则可能帮助不大。 - Martin Smith
<> '' and !='' are both used to check for inequality in SQL queries. However, there is no performance difference between the two. They are essentially equivalent and will produce the same results. It is simply a matter of personal preference or coding style. - undefined
1
@Caltor - 不,它们在解析过程中都被解析为相同的符号,因此完全无法区分。https://dba.stackexchange.com/a/155670/3690 - undefined

182
WHERE NULLIF(your_column, '') IS NOT NULL

现在(已经过去4.5年),为了方便人类阅读,我会直接使用:

WHERE your_column <> ''

虽然有一种诱惑让空值检查变得显式...

WHERE your_column <> '' 
      AND your_column IS NOT NULL

...正如@Martin Smith在被接受的答案中所证明的那样,它并没有真正增加任何内容(而我个人现在完全避免使用SQL nulls,所以它对我也不适用!)。


30

基本方式

SELECT *
FROM [TableName]
WHERE column_name!='' AND column_name IS NOT NULL

4
不需要检查它是否为NULL,column_name !=''就可以做到。因此表达式可以简化。 - SJHowe

20

您可以使用其中任何一个来检查null、空格和空字符串。

WHERE COLUMN <> '' 

WHERE LEN(COLUMN) > 0

WHERE NULLIF(LTRIM(RTRIM(COLUMN)), '') IS NOT NULL

20

Coalesce将null折叠成默认值:

COALESCE (fieldName, '') <> ''

9
一种索引友好的实现方式是:
where (field is not null and field <> '')

如果行数不多或该字段没有索引,您可以使用:

 where isnull(field,'') <> ''

2

请检查:where value > '' -- 不为空且不为null

-- COLUMN CONTAINS A VALUE (ie string not null and not empty) :
-- (note: "<>" gives a different result than ">")
select iif(null    > '', 'true', 'false'); -- false (null)
select iif(''      > '', 'true', 'false'); -- false (empty string)
select iif(' '     > '', 'true', 'false'); -- false (space)
select iif('    '  > '', 'true', 'false'); -- false (tab)
select iif('
'                  > '', 'true', 'false'); -- false (newline)
select iif('xxx'   > '', 'true', 'false'); -- true
--
--
-- NOTE - test that tab and newline is processed as expected:
select 'x   x' -- tab
select 'x

x' -- newline

-1

检查这种方式 其中Ph!= ''且Ph ='123456780'


WHERE LEN(Ph) > 0 - Rameesh Puthukkudy

-1
由于某种原因,我的NULL值的数据长度为8。这就是为什么上述方法似乎都不起作用。如果你遇到同样的问题,请使用以下代码:
--Check the length of your NULL values
SELECT DATALENGTH(COLUMN) as length_column
FROM your_table

--Filter the length of your NULL values (8 is used as example)
WHERE DATALENGTH(COLUMN) > 8

这很可能是一个包含 NULL 单词的 NVARCHAR 数据类型的字符串,而不是实际的 NULL。要查找这些字符串,您只需要使用 = N'NULL',因为它们就像普通字符串一样! - Martin Smith

-1
检查SQL命令中的非空条件和空字符串使用'is null / not null'和'!='。 请尝试以下示例模式脚本:
SELECT * FROM [Employee] 
WHERE
    EMail is not null -- not null check
    and Email != '' -- not empty check

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