如何检查Sql服务器字符串是否为null或为空


225

我想检查数据,但如果它为null或为空,则将其忽略。当前查询如下...

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      

但是我想得到company.OfferText如果listing.Offertext是一个空字符串,以及它是否为null。

什么是性能最好的解决方案?

Answers:


433

我认为这:

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
由于他似乎先回答了我的问题,所以我无法决定是否应该回答你的回答或叔叔的回答,但是你回答之后,他的回答已被编辑。我最终都反对。
Zecc 2011年

如果listing.Offer_Text ='',则传递NULLIF条件。我很伤心。
Merritt 2012年

只要company.Offer_Text不为null,但这会使事情复杂化... =)
Coops 2013年

3
我们不应该使用修剪来确保一切按计划进行

5
@irfandar-好吧,如果您想将所有空格都视为空的字符串,请继续使用trim。否则,所有空格的字符串都不为空。
2013年

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

... 

在此示例中,如果listing.OfferText为NULL,则LEN()函数也应返回NULL,但仍不大于0。

更新资料

自发布此书以来,我在5 1/2年中学到了一些东西,现在做的事情大不相同了:

COALESCE(NULLIF(listing.OfferText,''), Company.OfferText, '')

这类似于已接受的答案,但是在也Company.OfferText为null的情况下也有一个备用。使用的其他当前答案均未NULLIF()这样做。


今天对此进行了投票,因此将其编入索引。我现在知道比原始答案更好的方法。
Joel Coehoorn

34
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

12

在SQL Server 2012中IIF,您可以使用,例如您可以像

SELECT IIF(field IS NULL, 1, 0) AS IsNull

您可以使用相同的方法检查字段是否为空。


6

使用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 '16

值得注意的是,但这是一个捷径,因为比较使null合并为正确的布尔值,因此当我们想为null或empty返回true时,这不适用于LEN(NULL)= 0的逆比较。 。
扎克·约翰逊

4
Select              
Coalesce(NullIf(listing.OfferText, ''), NullIf(company.OfferText, ''), '') As Offer_Text,         
from tbl_directorylisting listing  
 Inner Join tbl_companymaster company            
  On listing.company_id= company.company_id

对于第一个答案(5年后)加上一个,以同时使用两者NULLIF(),如果company.OfferText为null ,则合并为一个空字符串。但是,NULLIF()这里的第二个调用没有任何作用,好像该值是一个空字符串一样,您无论如何都要合并回一个空字符串。
Joel Coehoorn 2015年

4

COALESCE和NULLIF的这种简单组合应该可以解决问题:

SELECT             
  Coalesce(NULLIF(listing.OfferText, ''), company.OfferText) As Offer_Text
...

注意:如果要让语句返回空字符串而不是NULL(如果两个值均为NULL),则添加另一个空字符串作为最后一个COALESCE参数。


4

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

如果使用LEN(...)确定该字段是NULL还是EMPTY,则需要按以下方式使用它:

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

3

这是一个解决方案,但我不知道这是否是最好的...。

Select              
Coalesce(Case When Len(listing.Offer_Text) = 0 Then Null Else listing.Offer_Text End, company.Offer_Text, '') As Offer_Text,         
from tbl_directorylisting listing  
 Inner Join tbl_companymaster company            
  On listing.company_id= company.company_id

3
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


2

为了防止在SQL结果中带有EmptyNull值的记录

我们可以简单地添加 ..... WHERE Column_name != '' or 'null'


这将是第一个调用端口,但是例如,如果您要进行诸如从表中的多个列进行连接的操作,那么这将排除该行,而不仅仅是为该列显示空白
Coops 2013年

2
[Column_name] IS NULL OR LEN(RTRIM(LTRIM([Column_name]))) = 0

0

[Column_name]>''排除Null和空字符串。单引号之间有一个空格。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.