SQL如何处理没有值

时间:2016-04-06 10:37:21

标签: sql sql-server

当我运行下面的查询时

SELECT 
    COUNT(COALESCE(CASE PARTPPHY.TITRE 
                      WHEN 1 THEN 'Monsieur ' 
                      WHEN 2 THEN 'Madame ' 
                      WHEN 3 THEN 'Madame ' 
                      ELSE '' 
                    END + PARTPPHY.IDENTITE, PARTPPHY.IDENTITE)) AS ident,
    RESPONSABLES.DIR_LOC,
    PARTPPHY.IU_PART_PP,
    COALESCE(CASE PARTPPHY.TITRE 
                WHEN 1 THEN 'Monsieur ' 
                WHEN 2 THEN 'Madame ' 
                WHEN 3 THEN 'Madame ' 
                ELSE ''  
             END + PARTPPHY.IDENTITE,PARTPPHY.IDENTITE) AS IDENTITE,
    FONCTIONS_ECO.LIBEL AS LIBEL_FONCTION
FROM
    RESPONSABLES
INNER JOIN 
    ETABLISSEMENTS ON ETABLISSEMENTS.IU_ETS = RESPONSABLES.IU_ETS
LEFT OUTER JOIN 
    PARTPPHY ON RESPONSABLES.IU_PART_PP = PARTPPHY.IU_PART_PP
LEFT OUTER JOIN 
    FONCTIONS_ECO ON FONCTIONS_ECO.IU_FONC_ECO = RESPONSABLES.IU_FONC
WHERE 
    ETABLISSEMENTS.IU_ETS = 14783
    AND RESPONSABLES.GESTDEL = 1
GROUP BY 
    RESPONSABLES.DIR_LOC,
    PARTPPHY.IU_PART_PP,
    COALESCE(CASE PARTPPHY.TITRE WHEN 1 THEN 'Monsieur ' WHEN 2 THEN 'Madame ' WHEN 3 THEN 'Madame ' ELSE '' END + PARTPPHY.IDENTITE,PARTPPHY.IDENTITE),
    FONCTIONS_ECO.LIBEL

这是我的结果

enter image description here

然而,当我使用此查询时

SELECT COUNT(COALESCE(CASE PARTPPHY.TITRE 
WHEN 1 THEN 'Monsieur ' 
WHEN 2 THEN 'Madame ' 
WHEN 3 THEN 'Madame ' 
ELSE '' END + PARTPPHY.IDENTITE,PARTPPHY.IDENTITE)) AS ident,
       RESPONSABLES.DIR_LOC,
       PARTPPHY.IU_PART_PP,
       COALESCE(CASE PARTPPHY.TITRE WHEN 1 THEN 'Monsieur ' WHEN 2 THEN 'Madame ' WHEN 3 THEN 'Madame ' ELSE '' END + PARTPPHY.IDENTITE,PARTPPHY.IDENTITE) AS IDENTITE,
       FONCTIONS_ECO.LIBEL AS LIBEL_FONCTION
FROM RESPONSABLES
INNER JOIN ETABLISSEMENTS ON ETABLISSEMENTS.IU_ETS = RESPONSABLES.IU_ETS
LEFT OUTER JOIN PARTPPHY ON RESPONSABLES.IU_PART_PP = PARTPPHY.IU_PART_PP
LEFT OUTER JOIN FONCTIONS_ECO ON FONCTIONS_ECO.IU_FONC_ECO = RESPONSABLES.IU_FONC
WHERE ETABLISSEMENTS.IU_ETS = 1
  AND RESPONSABLES.GESTDEL = 1
GROUP BY RESPONSABLES.DIR_LOC,
         PARTPPHY.IU_PART_PP,
         COALESCE(CASE PARTPPHY.TITRE WHEN 1 THEN 'Monsieur ' WHEN 2 THEN 'Madame ' WHEN 3 THEN 'Madame ' ELSE '' END + PARTPPHY.IDENTITE,PARTPPHY.IDENTITE),
         FONCTIONS_ECO.LIBEL

我有这个

enter image description here

我的问题如下:

  • 它似乎不是null也不是空格:它是什么?
  • 我想在我的计数中有一个价值:我该怎么做呢?

由于

2 个答案:

答案 0 :(得分:3)

使用不带GROUP BY子句的COUNT时,即使WHERE子句不等于表中的任何记录,也总会返回一行。但是在使用GROUP BY子句时,只有在WHERE子句条件为真时才会返回记录。

请检查以下测试脚本

DECLARE @TEST TABLE(ID INT)
INSERT INTO @TEST VALUES(10)

--1.
SELECT COUNT(*) FROM @TEST WHERE ID = 11    --Result is 0
--2.
SELECT COUNT(*),ID FROM @TEST WHERE ID = 11 GROUP BY ID --No Result

此处第一个查询始终返回结果

(No column name)
0

但第二个问题不是。

您可以修改您的第二个查询,如下面的脚本,以获得' 0'结果

SELECT ISNULL(( SELECT COUNT(*) FROM @TEST WHERE ID = 11 GROUP BY ID ),0) 

答案 1 :(得分:1)

还有一个有效选项。在这两种情况下,您使用INNER JOIN,这是独占连接意义,如果不满足连接条件则不返回任何数据,或者更准确地说,结果是空集。

您的INNER JOIN条件已在ETABLISSEMENTS.IU_ETS = RESPONSABLES.IU_ETS

在第一个查询中,您的where语句显示为

  

WHERE ETABLISSEMENTS.IU_ETS = 14783 AND RESPONSABLES.GESTDEL = 1

这是您有空数据集的地方

在第二个查询中你的where语句是

  

WHERE ETABLISSEMENTS.IU_ETS = 1 AND RESPONSABLES.GESTDEL = 1

所以回答你的第一个问题: 可能没有匹配记录,其中ETABLISSEMENTS.IU_ETS = 14783 AND RESPONSABLES.GESTDEL = 1因此我们得到一个空集

在第二种情况下,满足where语句并且两个表中都有相应的条目,因此我们有结果。

根据您感兴趣的加入的哪一方,即在哪个表格中您希望该行存在,您可以切换

  

JOIN to OUTER JOIN (LEFT or RIGHT)

外连接是包含的,这意味着即使相应表中没有记录,它也会将表中左边或右边的所有行返回到连接。 然后在相应的表上应用count,即id列。如果没有记录,那么你将获得0

举例说明

CREATE TABLE #Left
(
 id INT
,col1 CHAR(3)
)

CREATE TABLE #Right 
(
 id INT 
,col2 CHAR(3)
)


INSERT INTO #Right 
( id, col2) 
VALUES 
(1,'c1')
,(2,'c2')
,(3,'c4')
,(4,'c5')

INSERT INTO #Left 
( id, col1) 
VALUES 
(1,'c1')
,(2,'c2')
,(3,'c3')
,(4,'c5')

-- empty set 
SELECT 
*
FROM #Left L 
 INNER JOIN #Right R 
  ON L.col1 = R.col2 
WHERE col1 = 'c3'

-- matching rows
SELECT 
*
FROM #Left L 
 INNER JOIN #Right R 
  ON L.col1 = R.col2 
WHERE col1 = 'c2'

-- Left Join 
SELECT 
L.*
,COUNT(R.col2) 
FROM #Left L 
 LEFT JOIN #Right R 
  ON L.col1 = R.col2 
WHERE col1 = 'c3'
GROUP BY L.id, L.col1