它们之间的区别是什么不是空的&<>' '

时间:2016-09-01 14:15:49

标签: sql sql-server tsql

看看我的例子,两个代码之间的区别是什么?

Select name from customers where name is not null

Select name from customers where name <> ''

5 个答案:

答案 0 :(得分:4)

他们完全不同的事情。

Select name from customers where name is not null

此选择任何在名称字段中具有值的客户。这些价值观可以包括''以及'Sam','John Jones','漂亮金发女郎'之类的东西。

Select name from customers where name <> ''

这将在Sql Server中至少选择所有非空或空白的名称。其他数据库可以不同地处理它。它也排除Null的原因是Null不能成为比较的一部分,因为根据定义它意味着我们不知道该字段的值是什么。

如果要返回实名和空值,只排除空字符串。在SQl Server中,您可以这样做:

Select name from customers where coalesce(name, 'Unknown') <>''

答案 1 :(得分:1)

这里有很多正确的答案,但我认为你错过了什么是NULL。它什么都没有,所以它无法与任何东西相提并论。这里有一些测试你

DECLARE @param CHAR(1)=NULL --you can replace @param with your column name in your queries

SELECT 1 WHERE @param = NULL   --you can't compare NULL to anything using = > < <> != or any other comparision operator
SELECT 1 WHERE @param = ''     --an empty value isn't the same as a NULL value so if a NULL is present it won't be returned
SELECT 1 where @param IS NULL  --this is how you have to check for null values

--If you want to check for both empty and nulls, you can force the empty string with COALESCE or ISNULL

SELECT 1 WHERE COALESCE(@param,'') = ''
SELECT 1 WHERE ISNULL(@param,'') = ''

答案 2 :(得分:1)

您缺少的关键概念是,在SQL Server中, NULL并不意味着没有值,这意味着该值未知。因此,请考虑一些愚蠢的样本数据:

DECLARE @t TABLE
    ( id INT IDENTITY(1,1) PRIMARY KEY CLUSTERED
    , name VARCHAR(10) NULL );
INSERT INTO @t 
VALUES
    ('dog'),
    ('cat'),
    (''),
    (NULL);

SELECT *
FROM @t 
WHERE name <> '';

您要求引擎返回名称不是空字符串的记录。在评估第四条记录时,它确定NULL是否等于空字符串。 NULL可能是空字符串,我们不知道......鉴于该值未知,引擎无法包含该记录,因为您只询问我们知道名称绝对不是空字符串的记录。

考虑针对相同数据的另一个查询:

WITH cteTemp AS
    (
    SELECT *
        ,   isEqualToEmptyString = CASE WHEN name = '' THEN 'true' ELSE 'false' END 
    FROM @t 
    )
SELECT *
FROM cteTemp
WHERE isEqualToEmptyString = 'false';

现在这是为了演示一个点并且有更简洁的方法来做同样的事情(例如HLGEM的答案中的COALESCE。)但是要理解这里发生了什么:查询首先确定哪些名称是空字符串(由于其值未知,因此排除了NULL)然后排除了那些。因此,返回NULL。

答案 3 :(得分:0)

空字符串和空字符串是两个不同的东西。表中的给定字段可以没有值(null)或空字符串的值(&#39;&#39;)。每个查询返回的结果将是互斥的。

答案 4 :(得分:0)

不为null确定被检查的对象/记录是否为真空值(无数据)。

<> ''表示不是空字符串,因此记录确实包含数据(存在空字符串)并且实际上不为空。

因此,使用is not null的查询将返回值为string.empty的记录,而使用<> ''的查询将返回既不为null也不为空的值。要捕获空字符串和空值,应在SQL语句中使用<> ''