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

问题描述 投票:0回答:19

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

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.OfferTex
是一个空字符串,以及它是否为空,我想得到
listing.Offertext
t。

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

string sql-server-2005 null
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;

67
投票
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
也为空。当前使用
NULLIF()
的其他答案都没有这样做。


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 函数检查 null 或空值。您可以只使用 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

5
投票

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

如果您使用 LEN(...) 来确定字段是 NULL 还是 EMPTY 那么您需要按如下方式使用它:

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

4
投票

这个语法:

SELECT *
FROM tbl_directorylisting listing
WHERE (civilite_etudiant IS NULL)

在 Microsoft SQL Server 2008 (SP3) 中为我工作


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

4
投票

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

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

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


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

3
投票

要检查变量是否为 null 或空,请使用以下命令:

IF LEN(ISNULL(@var, '')) = 0
    -- Is empty or NULL
ELSE
    -- Is not empty and is not NULL

2
投票

防止SQL结果中出现带有

Empty
Null
值的记录

我们可以简单地添加

..... WHERE Column_name != '' or 'null'


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

2
投票

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


1
投票

在处理

VARCHAR
/
NVARCHAR
数据时,大多数其他示例将空格视为空字符串,相当于 C# 函数
IsNullOrWhiteSpace

此版本尊重空白,并且与 C# 函数的工作方式相同

IsNullOrEmpty
:

IIF(ISNULL(DATALENGTH(val), 0) = 0, whenTrueValue, whenFalseValue)

简单测试:

SELECT
    '"' + val + '"' AS [StrValue],
    IIF(ISNULL(DATALENGTH(val), 0) = 0, 'TRUE', 'FALSE') AS IsNullOrEmpty
FROM ( VALUES 
    (NULL), 
    (''), 
    (' '), 
    ('a'), 
    ('a ')
) S (val)

0
投票

这也适合空间。

(len(rtrim(ltrim(isnull(MyField,'')))) !=0
© www.soinside.com 2019 - 2024. All rights reserved.