如何在SQL中使用NULL或空字符串


129

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


5
SQL中有一个OR关键字。
罗伯特·哈维

13
这个问题没有显示任何研究成果。做功课很重要。告诉我们您找到了什么,以及为什么它不能满足您的需求。这表明您已花时间尝试自我帮助,这使我们免于重复明显的答案,并且最重要的是,它可以帮助您获得更具体和相关的答案。常见问题解答
柯米特(Kermit)2013年

1
如何从MySQL表中选择列为NULL的数据的可能重复项 (这是一个MySQL问题,但对于t-sql基本上是相同的答案)
Michael Berkowski 2013年

Answers:



27

您可以简单地做到这一点:

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

25

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

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

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


1
Oracle的NVL(var1,'value')将处理空字符串''替换。T-SQL的Isnull(var1,'value')没有。
珍娜·叶

15
SELECT *
FROM   TableName
WHERE  columnNAme IS NULL OR 
       LTRIM(RTRIM(columnName)) = ''

2
SELECT * FROM TableName WHERE columnNAme是NULL还是RTRIM(columnName)=''
Xavier John

2
正如Xavier指出的,如果目标只是将其与空字符串进行比较ltrimrtrim则无需同时进行。原因:如果只有空白,则单个修剪将删除所有空白。例如,您不必担心比较是否失败,因为剩下的是“ abc”或“ abc”。
ToolmakerSteve

8

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

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

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

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

7

一些可疑的方法...

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,'') = '';

3

这是丑陋的MSSQL:

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

3

我最好的解决方案:

 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

祝好运


2

您检查null,如果IS为NULL,则字符串为空,其中LEN(RTRIM(LTRIM(Column)))= 0 in

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


1
SELECT *
FROM   Table
WHERE  column like '' or column IS NULL OR LEN(column) = 0

1

您可以使用isnullfunction来获取null文本字段的值和空值:

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

从字面上看,nullull函数只是检查该值是否为null。如果字符串为空(“”),它将不起作用。
Max Pringle

@Max Pringle。我没有不同的说法。所提供的代码也解决了问题请求。不确定您的贡献。建议进行修改,而不是不推荐。
阿尔贝托·德卡罗

会接受您的建议。我现在建议编辑。此where子句仅获取空值,而不获取空字符串值。nullif可用于获取空值。
Max Pringle

1
--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

您可以检查''NULL通过将其转换为NULL使用NULLIF

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

或者你可以检查NULL作为''使用SELECT ISNULL(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


1

通过此功能:

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(值,0)


1
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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.