【问题标题】:How do I check if a SQL Server text column is empty?如何检查 SQL Server 文本列是否为空?
【发布时间】:2010-09-07 04:46:34
【问题描述】:

我使用的是 SQL Server 2005。我有一个带有文本列的表,并且表中有很多行,其中该列的值不为空,但为空。尝试与 '' 进行比较会产生以下响应:

数据类型 text 和 varchar 在不等于运算符中不兼容。

是否有特殊的函数可以判断一个文本列的值是否不为null而是为空?

【问题讨论】:

  • 如果可能,我会将数据类型转换为 varchar(最大值),文本已被弃用 - 如果您正在触摸表格,最好现在开始进行更改。当然,请咨询您的 dba。但是,在必须转换之前,可以转换的东西越多,我的想法就越好。这将取决于你有多少代码使用包含和编写文本之类的东西,这将被破坏到现在是否这样做,但我提出来了,所以你知道这最终需要改变。

标签: sql-server sql-server-2005 sqldatatypes notnull emptydatatext


【解决方案1】:

它会做两件事:

  1. 空值检查和字符串空值检查
  2. 将空值替换为默认值,例如 NA。
SELECT coalesce(NULLIF(column_name,''),'NA') as 'desired_name') from table;

【讨论】:

    【解决方案2】:
    DECLARE @temp as nvarchar(20)
    
    SET @temp = NULL
    --SET @temp = ''
    --SET @temp = 'Test'
    
    SELECT IIF(ISNULL(@temp,'')='','[Empty]',@temp)
    

    【讨论】:

      【解决方案3】:

      不要使用isnull,而是使用case,因为性能更好。

      case when campo is null then '' else campo end
      

      在您的问题中,您需要这样做:

      case when campo is null then '' else
        case when len(campo) = 0 then '' else campo en
      end
      

      这样的代码:

      create table #tabla(
      id int,
      campo varchar(10)
      )
      
      insert into #tabla
      values(1,null)
      
      insert into #tabla
      values(2,'')
      
      insert into #tabla
      values(3,null)
      
      insert into #tabla
      values(4,'dato4')
      
      insert into #tabla
      values(5,'dato5')
      
      select id, case when campo is null then 'DATA NULL' else
        case when len(campo) = 0 then 'DATA EMPTY' else campo end
      end
      from #tabla
      
      drop table #tabla
      

      【讨论】:

      • 你先检查是否为空,然后你使用 len 函数...希望对你有帮助
      • 如果 Column 不是 NULL 和 Empty,没有文本怎么办?
      • 空格?或者你是什么意思?
      【解决方案4】:

      试试这个:

      select * from mytable where convert(varchar, mycolumn) = ''
      

      希望能帮到你!

      【讨论】:

        【解决方案5】:
        SELECT * FROM TABLE
        WHERE ISNULL(FIELD, '')=''
        

        【讨论】:

        • 赞成,但是 ... where ISNULL(TRIM(Field), '') = '' 更好;-),如果你觉得“”是一个空字符串,即使里面有空格
        • 对于 MySQL,正确的语法是:SQL SELECT * FROM TABLE WHERE IFNULL(FIELD, '')=''
        【解决方案6】:

        使用DATALENGTH方法,例如:

        SELECT length = DATALENGTH(myField)
        FROM myTABLE
        

        【讨论】:

          【解决方案7】:

          我知道这个问题有很多替代方案,但我只想将@Eric Z Beard 和@Tim Cooper 与@Enrique Garcia 和@Uli Köhler 发现的最佳解决方案放在一起。

          如果需要处理在您的用例场景中仅空格可能与空相同的事实,因为下面的查询将返回 1,而不是 0。

          SELECT datalength(' ')
          

          因此,我会选择类似的东西:

          SELECT datalength(RTRIM(LTRIM(ISNULL([TextColumn], ''))))
          

          【讨论】:

            【解决方案8】:

            只获取空值(而不是空值):

            SELECT * FROM myTable WHERE myColumn = ''
            

            获取空值和空值:

            SELECT * FROM myTable WHERE myColumn IS NULL OR myColumn = ''
            

            只获取空值:

            SELECT * FROM myTable WHERE myColumn IS NULL
            

            获取 null 和空以外的值:

            SELECT * FROM myTable WHERE myColumn <> ''
            


            请记住,仅在必要时才使用 LIKE 短语,因为与其他类型的搜索相比,它们会降低性能。

            【讨论】:

            • 你不是说myColumn IS NOT NULL AND my column = '';吗?
            【解决方案9】:

            使用 IS NULL 运算符:

            Select * from tb_Employee where ename is null
            

            【讨论】:

            • atoumey 在问题中指出“该列的值不为空,但它为空”,因此 ISNULL() 不起作用:)
            【解决方案10】:

            你必须同时做:

            SELECT * FROM Table WHERE Text IS NULL or Text LIKE ''

            【讨论】:

              【解决方案11】:

              我知道这篇文章很古老,但我发现它很有用。

              它没有解决我返回带有非空文本字段的记录的问题,所以我想我会添加我的解决方案。

              这是对我有用的 where 子句。

              WHERE xyz LIKE CAST('% %' as text)
              

              【讨论】:

                【解决方案12】:
                where datalength(mytextfield)=0
                

                【讨论】:

                • 这不是真正的问题,只是给只看标题的人的一个备注,当你的专栏可以是NULL时,别忘了加上OR mytextfield IS NULL
                • mytextfield IS NULL *OR* :-)
                • @ban-geoengineering SQL Server T-SQL 不支持短路评估技术,因此此处的顺序不会影响结果。
                【解决方案13】:

                如果值为 null 或为空,我希望显示一个预定义的文本(“No Labs Available”),我的朋友帮我解决了这个问题:

                StrengthInfo = CASE WHEN ((SELECT COUNT(UnitsOrdered) FROM [Data_Sub_orders].[dbo].[Snappy_Orders_Sub] WHERE IdPatient = @PatientId and IdDrugService = 226)> 0)
                                            THEN cast((S.UnitsOrdered) as varchar(50))
                                    ELSE 'No Labs Available'
                                    END
                

                【讨论】:

                • 哇,一个子查询。这一点都不贵。
                【解决方案14】:
                ISNULL(
                case textcolum1
                    WHEN '' THEN NULL
                    ELSE textcolum1
                END 
                ,textcolum2) textcolum1
                

                【讨论】:

                • 上述查询实际上将处理文本列的空性和空性,并根据条件相应地分配值。赞成答案,因为这是我一直在寻找的。谢谢
                【解决方案15】:

                null 和空字符串是否等效?如果是,我会在我的应用程序中包含逻辑(或者如果应用程序是“开箱即用”的,则可能是一个触发器?)以强制该字段为 null 或 '',而不是另一个。如果您使用 '',那么您也可以将该列设置为 NOT NULL。只是一个数据清洁的事情。

                【讨论】:

                  【解决方案16】:

                  实际上,你只需要使用 LIKE 运算符即可。

                  SELECT * FROM mytable WHERE mytextfield LIKE ''
                  

                  【讨论】:

                  • +1 我更喜欢这个答案而不是其他答案,因为它不依赖于调用 SQL 函数(如 DataLength()、IsNull() 或 Cast())的额外开销。可能生成的查询计划是一样的(我没查);我仍然觉得这是一种 far 更清洁的方法。
                  【解决方案17】:

                  我会针对 SUBSTRING(textColumn, 0, 1) 进行测试

                  【讨论】:

                    猜你喜欢
                    • 2012-02-03
                    • 2019-05-05
                    • 2011-03-08
                    • 2013-11-05
                    • 2015-12-28
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-09-18
                    • 1970-01-01
                    相关资源
                    最近更新 更多