【问题标题】:How to use NULL or empty string in SQL如何在 SQL 中使用 NULL 或空字符串
【发布时间】:2013-03-17 18:59:24
【问题描述】:

我想知道如何在 SQL Server 的 WHERE 子句中同时使用 NULL 和空字符串。我需要查找具有空值或空字符串的记录。谢谢。

【问题讨论】:

  • SQL中有一个OR关键字。
  • 这个问题没有显示任何研究工作。 做好功课很重要。告诉我们您发现了什么以及为什么它不能满足您的需求。这表明您已经花时间尝试帮助自己,它使我们免于重复明显的答案,最重要的是它可以帮助您获得更具体和相关的答案。 FAQ.
  • How to select data from MySQL table where a column is NULL 的可能重复项(这是一个 MySQL 问题,但与 t-sql 的答案基本相同)

标签: sql sql-server null where


【解决方案1】:
Select *
From Table
Where (col is null or col = '')

或者

Select *
From Table
Where IsNull(col, '') = ''

【讨论】:

  • 根据@Bradc 在此stackoverflow.com/questions/799584/… 中的回答,最好使用第一种方法。
  • 另请注意,cmets 表示在 MSSQL 2016 中,在 WHERE 中使用 ISNULL 与在 WHERE 中使用 OR 之间没有执行计划差异。据说他们都使用'col'上的索引并进行索引搜索。
【解决方案2】:

如果你需要在SELECT部分可以这样使用。

SELECT ct.ID, 
       ISNULL(NULLIF(ct.LaunchDate, ''), null) [LaunchDate]
FROM   [dbo].[CustomerTable] ct

您可以将null 替换为您的替换值。

【讨论】:

  • Oracle 的 NVL(var1, 'value') 将处理空字符串 ' ' 替换。 T-SQL 的 Isnull(var1, 'value') 没有。
【解决方案3】:

你可以这样做:

SELECT *
FROM   yourTable
WHERE  yourColumn IS NULL OR yourColumn = ''

【讨论】:

    【解决方案4】:
    SELECT *
    FROM   TableName
    WHERE  columnNAme IS NULL OR 
           LTRIM(RTRIM(columnName)) = ''
    

    【讨论】:

    • SELECT * FROM TableName WHERE columnName IS NULL OR RTRIM(columnName) = ''
    • 正如 Xavier 指出的那样,如果目标只是与空字符串进行比较,则无需同时执行 ltrimrtrim。原因:如果只有空格,则单个修剪将删除所有空格。例如,您不关心比较是否失败,因为剩下的是“abc”或“abc”。
    【解决方案5】:

    要查找 col 为 NULL、空字符串或空格(空格、制表符)的行:

    SELECT *
    FROM table
    WHERE ISNULL(LTRIM(RTRIM(col)),'')=''
    

    要查找 col 为 NOT NULL、空字符串或空格(空格、制表符)的行:

    SELECT *
    FROM table
    WHERE ISNULL(LTRIM(RTRIM(col)),'')<>''
    

    【讨论】:

      【解决方案6】:

      一些sargable 方法...

      SELECT *
      FROM #T
      WHERE SomeCol = '' OR SomeCol IS NULL;
      
      SELECT *
      FROM #T
      WHERE SomeCol = '' 
      UNION ALL
      SELECT *
      FROM #T
      WHERE  SomeCol IS NULL;
      
      SELECT *
      FROM #T
      WHERE EXISTS ((SELECT NULL UNION SELECT '') INTERSECT SELECT SomeCol);
      

      还有一些不可分割的......

      SELECT *
      FROM #T
      WHERE IIF(SomeCol <> '',0,1) = 1;
      
      SELECT *
      FROM #T
      WHERE NULLIF(SomeCol,'') IS NULL;
      
      SELECT *
      FROM #T
      WHERE ISNULL(SomeCol,'') = '';
      

      【讨论】:

        【解决方案7】:

        我最好的解决方案:

         WHERE  
         COALESCE(char_length(fieldValue), 0) = 0
        

        COALESCE 返回表达式 list() 中的第一个非空 expr。

        如果 fieldValue 为 null 或空字符串,则:我们将返回第二个元素,然后是 0。

        所以 0 等于 0 那么这个 fieldValue 是一个 null 或空字符串。

        以python为例:

        def coalesce(fieldValue):
            if fieldValue in (null,''):
                return 0
        

        祝你好运

        【讨论】:

          【解决方案8】:

          您可以使用isnull 函数获取null 和文本字段的空值:

          SELECT * FROM myTable
          WHERE isnull(my_nullable_text_field,'') = ''
          

          【讨论】:

          • isnull 函数实际上只是检查值是否为空。如果字符串为空(“”),它将不起作用。
          • @Max Pringle。我没有不同的说法。提供的代码也解决了问题请求。不确定你的贡献。建议修改而不是投反对票。
          • 会听取您的建议。我现在提出了建议的编辑。这个 where 子句只获取空值而不是空字符串值。可以使用 nullif 来获取空值。
          【解决方案9】:

          这是丑陋的 MSSQL:

          CASE WHEN LTRIM(RTRIM(ISNULL([Address1], ''))) <> '' THEN [Address2] ELSE '' END
          

          【讨论】:

            【解决方案10】:
            select 
               isnull(column,'') column, * 
            from Table  
            Where column = ''
            

            【讨论】:

              【解决方案11】:
              SELECT *
              FROM   Table
              WHERE  column like '' or column IS NULL OR LEN(column) = 0
              

              【讨论】:

                【解决方案12】:
                --setup
                IF OBJECT_ID('tempdb..#T') IS NOT NULL DROP TABLE #T;
                CREATE TABLE #T(ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY, NAME VARCHAR(10))
                INSERT INTO #T (Name) VALUES('JOHN'),(''),(NULL);
                SELECT * FROM #T
                 1  JOHN
                 2  -- is empty string
                 3  NULL
                

                您可以使用NULLIF'' 转换为NULL,将'' 视为NULL

                --here you set '' to null
                UPDATE #T SET NAME = NULLIF(NAME,'')
                SELECT * FROM #T 
                 1  JOHN
                 2  NULL
                 3  NULL
                

                或者你可以使用SELECT ISNULL(NULL,'')检查NULL作为''

                -- here you set NULL to ''
                UPDATE #T SET NAME = ISNULL(NULL,'') WHERE NAME IS NULL
                SELECT * FROM #T
                1   JOHN
                2   -- is empty string
                3   -- is empty string
                
                --clean up
                DROP TABLE #T
                

                【讨论】:

                  【解决方案13】:

                  在sproc中,可以使用以下条件:

                  DECLARE @USER_ID VARCAHR(15)=NULL --THIS VALUE IS NULL OR EMPTY DON'T MATTER
                  IF(COALESCE(@USER_ID,'')='')
                  PRINT 'HUSSAM'
                  

                  【讨论】:

                    【解决方案14】:

                    通过这个函数:

                    ALTER FUNCTION [dbo].[isnull](@input nvarchar(50),@ret int = 0)
                    RETURNS int
                    AS
                    BEGIN
                    
                        return (case when @input='' then @ret when @input is null then @ret else @input end)
                    
                    END
                    

                    并使用它:

                    dbo.isnull(value,0)

                    【讨论】:

                      【解决方案15】:
                      SELECT * FROM DBO.AGENDA
                      WHERE 
                        --IF @DT_START IS NULL OR EMPTY
                        ( ISNULL( @DT_START,'' ) = '' AND DT_START IS NOT NULL ) -- GET ALL DATE
                        OR --ELSE
                        ( DT_START >= @DT_START ) --FILTER
                      
                      -- MORE FILTER
                      
                      SELECT * FROM DBO.AGENDA
                      WHERE 
                        ( ( ISNULL( @DT_START,'' ) = '' AND DT_START IS NOT NULL ) OR ( DT_START >= @DT_START ) ) 
                        AND
                        DT_END < GETDATE()
                      

                      【讨论】:

                        【解决方案16】:

                        你检查 null 和 IS NULL 和字符串 Empty With LEN(RTRIM(LTRIM(Column))) = 0 在

                        SELECT *
                        FROM AppInfra.Person
                        WHERE   LEN(RTRIM(LTRIM(NationalCode))) = 0 OR  NationalCode IS NULL
                        

                        【讨论】:

                          猜你喜欢
                          • 2020-06-18
                          • 1970-01-01
                          • 1970-01-01
                          • 2020-10-10
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多