当有一些非 NULL 值时,为什么 MySQL GROUP_CONCAT returns NULL

Why MySQL GROUP_CONCAT returns NULL when there are some non-NULL values

下面是一些示例代码:

CREATE TABLE test (
  first_name VARCHAR(255),
  last_name VARCHAR(255)
);
INSERT INTO test (first_name) VALUES ('first_1');
INSERT INTO test (last_name) VALUES ('last_1');

SELECT GROUP_CONCAT(first_name, last_name) FROM test;
SELECT GROUP_CONCAT(first_name), GROUP_CONCAT(last_name) FROM test;

第一个 select returns null,而 MySQL documentation 声明它 returns null 如果没有非 NULL 值。 Here 是一个演示。

这个结果是意料之中的。考虑第一个查询:

SELECT GROUP_CONCAT(first_name, last_name) FROM test;

因为每条记录的名字或姓氏都有一个 NULL,所以您要连接一个 NULL 值,然后在该 NULL 上聚合,也会产生 NULL.为了更好地理解这种行为,运行 查询 SELECT CONCAT('Hello', NULL) FROM dual 并观察输出为 NULL.

然而,在第二个查询中:

SELECT GROUP_CONCAT(first_name), GROUP_CONCAT(last_name) FROM test;

您正在对单个 进行分组连接。在这种情况下,NULL 值将被 忽略 ,您将留下非 NULL 名字和姓氏的单独值。

以图解的方式,我们可以得出如下:

first_name | last_name | CONCAT (first_name, last_name)
first_1    | NULL      | NULL
NULL       | last_1    | NULL
--------------------------------
first_1    | last_1    | NULL    <-- GROUP_CONCAT of columns

您可以看到 GROUP_CONCAT 跨记录的行为与其他聚合函数一样,忽略了 NULL 值。但是在 中,GROUP_CONCAT 将首先进行串联,即使有一个值是 NULL.

也会导致 NULL

使用having

SELECT
    `a`.`id`, `a`.`name`, `b`.`id` AS  `b_id`, `b`.`name` AS  `b_name`,   GROUP_CONCAT(  `c`.`l_id` ) AS  `c_ls`
FROM  
    `a`
    INNER JOIN  `b` ON  `a`.`b_id` =  `b`.`id`
    LEFT OUTER JOIN  `c` ON  `a`.`id` = `c`.`a_id`
having `a`.`id` IS NOT NULL
GROUP BY `a`.`id`
ORDER BY `a`.`created` DESC