看看我的例子,两个代码之间的区别是什么?
Select name from customers where name is not null
Select name from customers where name <> ''
答案 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语句中使用<> ''
。