为什么我的IfNull()函数不起作用?

时间:2018-07-23 06:34:05

标签: mysql sql database

SELECT
    f.province AS loc,
    IFNULL(COUNT(f.province), 0) AS count
FROM
    project_name_data d
RIGHT JOIN full_province f ON (
    TRIM(
        REPLACE (
            REPLACE (
                SUBSTRING_INDEX(d.location, '|', 1),
                '省',
                ''
            ),
            '壮族',
            ''
        )
    ) = f.province
)
GROUP BY
    loc;

这是我的查询Sql,full_province是包含中国所有省份的表,而project_name_data引用主数据。现在我想计算每个省有多少条记录,对于没有任何记录的省,请给它们0。 但是我的Sql只返回包含记录的省份。是否有一些错误?

一个不明显的例子:

-- main table
id   location      comment  other columns
1    Los Angeles   aaa        ...
2    New York      bbb        ...
3    Cambridge     ccc        ...
4    Philadelphia  ddd        ...
5    New York      eee        ...
6    Cambridge     fff        ...

--full_province table
id    location
1     Los Angeles
2     New York
3     Cambridge
4     Philadelphia
5     Beijing
6     Tokyo
7     Barcelona
8     Paris
9     Toronto

期望输出:

      location      count
1     Los Angeles     1
2     New York        2
3     Cambridge       2
4     Philadelphia    1
5     Beijing         0
6     Tokyo           0
7     Barcelona       0
8     Paris           0
9     Toronto         0

4 个答案:

答案 0 :(得分:2)

可以删除

IFNULL,因为如果d.province的值为NULL COUNT不会累积。将返回0

SELECT
    f.province AS loc,
    COUNT(d.province) AS count
FROM
    project_name_data d
RIHGT JOIN full_province f ON (
    TRIM(
        REPLACE (
            REPLACE (
                SUBSTRING_INDEX(d.location, '|', 1),
                '省',
                ''
            ),
            '壮族',
            ''
        )
    ) = f.province
)
GROUP BY f.province;

编辑

我看到您添加了一些示例数据。

您可以尝试此查询。

SELECT
    f.location AS loc,
    COUNT(d.location) AS CNT
FROM
    project_name_data d
right JOIN full_province f
ON d.location= f.location
GROUP BY f.location
ORDER BY d.id desc

sqlfiddle

[结果]

|          loc | CNT |
|--------------|-----|
| Philadelphia |   1 |
|    Cambridge |   2 |
|     New York |   2 |
|  Los Angeles |   1 |
|      Beijing |   0 |
|    Barcelona |   0 |
|      Toronto |   0 |
|        Tokyo |   0 |
|        Paris |   0 |

答案 1 :(得分:1)

因为COUNT,它将永远不会返回您的值NULL。

答案 2 :(得分:1)

我会替换sum(case when f.province is not null then 1 else 0 end)

答案 3 :(得分:1)

替换:

IFNULL(COUNT(f.province), 0) AS count

使用:

sum(case when d.location is not null then 1 else 0 end)

可能会更好地工作-您正在计算链接到省表的主表中非空位置的数量,如果(由于正确的联接)位置的空值为零,则为零。