[英]Sql(Server) NULL or empty string still here
我有这个问题
SELECT Ets_Se_Categorie AS Ets_Se_Categorie,COUNT(Ets_Se_Categorie) AS cpte
FROM TableV_MyTest
GROUP BY Ets_Se_Categorie
它给了我下面的表/结果
Ets_Se_Categorie cpte
(Seems to be empty string) 5531
Old place 8
Secondary 1066
Principal 4713
Subsidiary 7985
First 9
headquarter 31610
Main Headquarter 1587
(Seems to be empty string)
表示它是一个空字段
目的就是拥有这个
Ets_Se_Categorie cpte
Old place 8
Secondary 1066
Principal 4713
Subsidiary 7985
First 9
headquarter 31610
Main Headquarter 1587
我已经创建了这个查询
SELECT *
FROM
(
SELECT Ets_Se_Categorie AS Ets_Se_Categorie,COUNT(Ets_Se_Categorie) AS cpte
FROM TableV_MyTest
GROUP BY Ets_Se_Categorie
) AS A
WHERE (A.Ets_Se_Categorie IS NOT NULL OR A.Ets_Se_Categorie != '')
问题没有改变......
为什么我使用嵌套查询?
我先尝试过这个
SELECT Ets_Se_Categorie,COUNT(Ets_Se_Categorie) AS cpte
FROM TableV_MyTest
WHERE (Ets_Se_Categorie IS NOT NULL OR Ets_Se_Categorie != '')
GROUP BY Ets_Se_Categorie
没啥事儿...
任何见解将不胜感激。 可能很简单,但我对它的原因有点困惑。
谢谢!
您使用OR
而不是AND
,这应该工作:
WHERE (A.Ets_Se_Categorie IS NOT NULL AND A.Ets_Se_Categorie != '')
由于关于为什么OR
没有按预期工作的混淆:
返回记录时,两个条件都必须为true
。 所有记录都是NOT NULL
或!= ''
。 考虑一个带有空字符串的记录,该记录为NOT NULL
,因此返回。
为什么你没有看到NULL
记录:
NULL
不是有效值,表示未定义 。 所以没有任何东西是等于或不等于NULL
。 NULL = NULL
也不是Anything != NULL
为true
。 您必须使用IS (NOT) NULL
。
在原始查询中,您已过滤掉NULL
值:
SELECT Ets_Se_Categorie,COUNT(Ets_Se_Categorie) AS cpte
FROM TableV_MyTest
WHERE (Ets_Se_Categorie IS NOT NULL OR Ets_Se_Categorie != '')
GROUP BY Ets_Se_Categorie
因为NULL
既不是NOT NULL
也不是!= ''
(记得最后一节)。
结论:使用IS NOT NULL AND != ''
或ISNULL(Column, '') != ''
或COALESCE(Column, '') != ''
这是ANSI sql(适用于所有数据库)。
你可以改用ISNULL 。 像这样:
WHERE ISNULL(A.Ets_Se_Categorie, '') != ''
你试过LTRIM, RTRIM
来删除空格吗?
SELECT
LTRIM(RTRIM(Ets_Se_Categorie))
,COUNT(LTRIM(RTRIM(Ets_Se_Categorie))) AS cpte
FROM TableV_MyTest
WHERE
(Ets_Se_Categorie IS NOT NULL AND LTRIM(RTRIM(Ets_Se_Categorie)) != '')
GROUP BY
LTRIM(RTRIM(Ets_Se_Categorie))
尝试检查列中的空格。
SELECT Ets_Se_Categorie AS Ets_Se_Categorie,COUNT(Ets_Se_Categorie) AS cpte
FROM TableV_MyTest
WHERE LEN(ISNULL(Ets_Se_Categorie, '')) <> 0
GROUP BY Ets_Se_Categorie
你需要在这里使用AND。 它仍然返回,因为它看起来并且看到该列不是NULL并返回它。 这就是OR的工作原理,如果第一个子句为真则返回。
SELECT Ets_Se_Categorie,COUNT(Ets_Se_Categorie) AS cpte
FROM TableV_MyTest
WHERE (Ets_Se_Categorie IS NOT NULL AND Ets_Se_Categorie != '')
GROUP BY Ets_Se_Categorie
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.