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

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      

但我想找个伴。OfferText如果列表。Offertext是一个空字符串,如果它是null。

最好的解决方案是什么?


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

... 

在本例中,使用if列表。OfferText是NULL, LEN()函数也应该返回NULL,但这仍然不是> 0。

更新

在发布这篇文章后的5年半里,我学到了一些东西,现在做得很不同:

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

这与公认的答案类似,但它也有一个备用方案。OfferText也是null。使用NULLIF()的其他当前答案也不这样做。


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

您可以使用ISNULL并根据已知输出检查答案:

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

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

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

这里有另一个解决方案:

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

我认为:

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;

防止SQL结果中出现空值或空值的记录

我们可以简单地添加.....WHERE Column_name != "或'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

这个语法:

SELECT *
FROM tbl_directorylisting listing
WHERE (civilite_etudiant IS NULL)

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


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

在SQL Server 2012中你有IIF,例如你可以像这样使用它

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

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


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

COALESCE和NULLIF的简单组合应该可以做到:

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

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


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

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

如果你正在使用LEN(…)来确定字段是NULL还是EMPTY,那么你需要像下面这样使用它:

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

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

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

这也迎合了空间。

(len(rtrim(ltrim(isnull(MyField,'')))) !=0

[Column_name] > ' '不包含空字符串和空字符串。在单引号之间有一个空格。


在处理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)