【问题标题】:How do I check if a Sql server string is null or empty如何检查 Sql 服务器字符串是否为空或为空
【发布时间】:2010-09-24 22:45:59
【问题描述】:

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

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 是一个空字符串,我想得到company.OfferText,如果它是空字符串也是如此。

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

【问题讨论】:

    标签: sql-server-2005


    【解决方案1】:

    我认为:

    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;
    

    【讨论】:

    • 我无法决定是否应该投票赞成您的回答或 unclefofa 的回答,因为他似乎先回答了,但在您回答后他的回答已被编辑。我最终都投了赞成票。
    • 如果 listing.Offer_Text = ' ',它通过 NULLIF 条件。我很难过。
    • 只要 company.Offer_Text 不为空,但这会使事情复杂化... =)
    • 我们不应该使用修剪来确保一切按计划进行
    • @irfandar - 好吧,如果您想将所有空格都视为空的字符串,请继续使用修剪。否则全空格的字符串不为空。
    【解决方案2】:
    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() 的其他当前答案都没有这样做。

    【讨论】:

    • 今天得到了投票,所以它在某个地方被索引了。我现在知道比原来的答案更好的方法。
    【解决方案3】:
    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
    

    【讨论】:

      【解决方案4】:

      这是另一个解决方案:

      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
      

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          在 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 !
            • 这是值得注意的,但这可以作为一种捷径,因为比较会使空值合并到正确的布尔值,所以当我们使用 LEN(NULL) = 0 的逆比较时,这将不起作用想要为 null 或空返回 true。
            【解决方案8】:

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

            如果你使用 LEN(...) 来判断字段是 NULL 还是 EMPTY 那么你需要使用它如下:

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

            【讨论】:

              【解决方案9】:

              这个语法:

              SELECT *
              FROM tbl_directorylisting listing
              WHERE (civilite_etudiant IS NULL)
              

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

              【讨论】:

                【解决方案10】:
                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
                

                【讨论】:

                • 如果company.OfferText 为空,则第一个答案(5 年后)同时使用NULLIF() 并合并为一个空字符串。但是,这里的第二个NULLIF() 调用没有任何作用,就好像那个值是一个空字符串,你无论如何都会合并回一个空字符串。
                【解决方案11】:

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

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

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

                【讨论】:

                  【解决方案12】:

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

                  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
                  

                  【讨论】:

                    【解决方案13】:
                    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
                    

                    【讨论】:

                      【解决方案14】:

                      要检查变量是否为空或为空,请使用:

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

                      【讨论】:

                        【解决方案15】:

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

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

                        【讨论】:

                        • 这将是第一个调用端口,但如果您正在执行诸如从表中的多个列连接之类的操作,那么这将排除该行,而不仅仅是为该列显示一个空白跨度>
                        【解决方案16】:
                        [Column_name] IS NULL OR LEN(RTRIM(LTRIM([Column_name]))) = 0
                        

                        【讨论】:

                          【解决方案17】:

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

                          【讨论】:

                            【解决方案18】:

                            这也适合空间。

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

                            【讨论】:

                              【解决方案19】:

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

                              【讨论】:

                                猜你喜欢
                                • 2015-06-05
                                • 2017-08-19
                                • 1970-01-01
                                • 2012-11-24
                                • 2015-06-12
                                • 2020-05-29
                                • 2017-01-10
                                • 2010-10-23
                                • 2011-11-25
                                相关资源
                                最近更新 更多