如何检查一个 Sql server 字符串是否为 null 或者为空

258
我想检查数据,但如果数据为空或者为空字符串,则忽略它。目前查询的语句如下...
Select              
Coalesce(listing.OfferText, company.OfferText, '') As Offer_Text,         
from tbl_directorylisting listing  
 Inner Join tbl_companymaster company            
  On listing.company_id= company.company_id      

但是如果listing.Offertext是一个空字符串,或者它是null,我想要获取company.OfferTex
什么是最佳的解决方案?
19个回答

488

我认为这样:

SELECT 
  ISNULL(NULLIF(listing.Offer_Text, ''), company.Offer_Text) AS Offer_Text
FROM ...

这是最优雅的解决方案。

为了将其拆分为伪代码:

// a) NULLIF:
if (listing.Offer_Text == '')
  temp := null;
else
  temp := listing.Offer_Text; // may now be null or non-null, but not ''
// b) ISNULL:
if (temp is null)
  result := true;
else
  result := false;

1
我无法决定是否应该给你的答案或者unclefofa的答案点赞,因为他似乎先回答了,但是他的答案在你回答后被编辑过。 最终我选择了给两个答案都点赞。 - Zecc
如果 listing.Offer_Text = ' ',它将通过 NULLIF 条件。我感到困惑和难过。 - Merritt
只要 company.Offer_Text 不为空,但这会使事情变得复杂... =) - Paul C
3
我们应该使用修剪功能以确保一切按计划进行。 - irfandar
5
如果你希望将一个只包含空格的字符串视为空字符串,那么可以使用 trim 函数。否则,一个只包含空格的字符串并不是空字符串。 - Martin Ba
这也是一种模拟 IIF(ISITNULL??, yes_value, no_value) 的好方法(使用 ISNULL 作为第一个参数很奇怪,因为它需要两个自己的参数)。相反,您可以使用 ISNULL(NULLIF(no_value, Null), yes_value) - johnDanger

67
SELECT
   CASE WHEN LEN(listing.OfferText) > 0 THEN listing.OfferText 
        ELSE COALESCE(Company.OfferText, '') END 
   AS Offer_Text,

... 
在这个例子中,如果listing.OfferText为空,那么LEN()函数应该返回NULL,但是它仍然不大于0。 更新 我在发布这篇文章之后的5年半时间里学到了一些东西,并且现在做事情的方式完全不同了。
COALESCE(NULLIF(listing.OfferText,''), Company.OfferText, '')

这与已接受的答案类似,但它还有一个后备选项,以防Company.OfferText也为空。其他当前使用NULLIF()的答案也没有这样做。


1
今天这个被点赞了,所以它已经被索引了。我现在知道一个比原来的答案更好的方法。 - Joel Coehoorn

36
Select              
CASE
    WHEN listing.OfferText is null or listing.OfferText = '' THEN company.OfferText
    ELSE COALESCE(Company.OfferText, '')
END As Offer_Text,         
from tbl_directorylisting listing  
 Inner Join tbl_companymaster company            
  On listing.company_id= company.company_id

18

这里有另一种解决方案:

SELECT Isnull(Nullif(listing.offertext, ''), company.offertext) AS offer_text, 
FROM   tbl_directorylisting listing 
       INNER JOIN tbl_companymaster company 
         ON listing.company_id = company.company_id

14

你可以使用 ISNULL 函数并将其结果与已知输出进行比较:

SELECT case when ISNULL(col1, '') = '' then '' else col1 END AS COL1 FROM TEST

13
在SQL Server 2012中,你可以使用 IIF 函数,例如可以这样使用:
SELECT IIF(field IS NULL, 1, 0) AS IsNull

同样的方法,您可以检查字段是否为空。

7

使用LEN函数检查空值或空字符串。你只需使用LEN(@SomeVarcharParm) > 0。如果值为NULL、''或' ',则此方法将返回false。这是因为LEN(NULL)返回NULL且NULL>0返回false。另外,LEN(' ')返回0。请运行以下代码自行验证:

SELECT 
 CASE WHEN NULL > 0 THEN 'NULL > 0 = true' ELSE 'NULL > 0 = false' END,
 CASE WHEN LEN(NULL) > 0 THEN 'LEN(NULL) = true' ELSE 'LEN(NULL) = false' END,
 CASE WHEN LEN('') > 0 THEN 'LEN('''') > 0 = true' ELSE 'LEN('''') > 0 = false' END,
 CASE WHEN LEN(' ') > 0 THEN 'LEN('' '') > 0 = true' ELSE 'LEN('' '') > 0 = false' END,
 CASE WHEN LEN(' test ') > 0 THEN 'LEN('' test '') > 0 = true' ELSE 'LEN('' test '') > 0 = false' END

当你说“... LEN(NULL) 返回 NULL 和 NULL > 0 返回 false ...”时,真正的规则是每个与 NULL 的测试或比较都返回 NULL! - Didier68
这是值得注意的正确,但这是一种快捷方式,因为比较使空合并到正确的布尔值,所以当我们想要返回null或空时,这不适用于LEN(NULL) = 0的反向比较。 - Zach Johnson

5

我知道这是一个旧的帖子,但我刚刚看到上面的早期帖子之一,它是不正确的。

如果您正在使用 LEN(...) 来确定字段是否为 NULL 或 EMPTY,那么您需要按以下方式使用它:

...WHEN LEN(ISNULL(MyField, '')) < 1 THEN NewValue...

4
这个简单的COALESCE和NULLIF的组合应该能解决问题:
SELECT             
  Coalesce(NULLIF(listing.OfferText, ''), company.OfferText) As Offer_Text
...

注意:如果两个值都为NULL,而你希望语句返回一个空字符串而不是NULL,请将另一个空字符串作为COALESCE的最后一个参数添加。


4
这个语法:
SELECT *
FROM tbl_directorylisting listing
WHERE (civilite_etudiant IS NULL)

这对我在Microsoft SQL Server 2008 (SP3)上起作用了。


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