当有一些非 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
下面是一些示例代码:
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