Sql(Server)NULL或空字符串仍然在这里

时间:2016-01-20 14:01:55

标签: sql sql-server

我有这个查询

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

什么都没发生......

任何见解都将不胜感激。可能很简单,但我对其原因感到困惑。

谢谢!

5 个答案:

答案 0 :(得分:3)

您使用OR代替AND,这应该有效:

WHERE (A.Ets_Se_Categorie IS NOT NULL AND A.Ets_Se_Categorie != '')

由于对于OR无法正常工作的原因感到困惑:

这两个条件必须为true才能返回记录。所有记录都是NOT NULL!= ''。考虑一个空字符串的记录,该记录为NOT NULL,因此返回。

为什么你没有看到NULL记录:

NULL不是有效值,表示 undefined 。所以没有任何东西与NULL相等或不相等。 NULL = NULLAnything != 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(适用于所有数据库)。

答案 1 :(得分:2)

您只需使用ISNULL即可。像这样:

WHERE ISNULL(A.Ets_Se_Categorie, '') != ''

答案 2 :(得分:1)

您是否尝试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))

答案 3 :(得分:1)

尝试检查列中的空格。

monthly at midnight: `0 0 0 1 * *`
monthly at 1 am: `0 0 1 1 * *`
weekly, on sunday at midnight: `0 0 0 * * SUN`

答案 4 :(得分:1)

你需要在这里使用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