为什么在 MySQL 上使用 UNION ALL 时空记录会导致整行为空?

Why is a null record cause an entire row to be null when using UNION ALL on MySQL?

架构看起来像,

CREATE TABLE `test` (
    `id` INT,
    `countryCode` VARCHAR(50),
    `state` VARCHAR(50)
)  ENGINE=INNODB DEFAULT CHARSET=UTF8MB4 COLLATE = UTF8MB4_0900_AI_CI;

数据看起来像,

insert into `test` values 
(1,'AE','AE'),
(2,'SA','SA'),
(3,NULL,'SA') ;

我们正在使用以下查询生成最终将转储到数据文件的数据

SELECT ('id|countryCode|state|') AS `line` 
UNION ALL SELECT 
    CONCAT(CONCAT(`id`, '|'),
            CONCAT(`countryCode`, '|'),
            CONCAT(`state`, '|')) AS `line`
FROM
    `test`;

所以这里的问题是如果记录为空,在本例中 id 3 的国家/地区代码为空,则查询认为该行为空。 当前输出是,

id|countryCode|state|
1|AE|AE|
2|SA|SA|
*null*

我应该怎么做才能使查询 return 它找到的数据而不是整行都为空。

期望的输出是,

id|countryCode|state|
1|AE|AE|
2|SA|SA|
3||SA

dbfiddle

我知道的唯一解决方案是为每一列插入一个 CASE 或 IF 例如

SELECT ('id|countryCode|state|') AS `line` 
UNION ALL SELECT 
CONCAT(CONCAT(CASE WHEN `id`IS NULL THEN '' ELSE `id` END , '|'),
        CONCAT(CASE WHEN `countryCode` IS NULL THEN '' ELSE `countryCode` END, '|'),
        CONCAT(CASE WHEN `state` IS NULL THEN '' ELSE `state` END, '|')) AS `line` 
FROM
    `test`;

CONCAT() returns NULL 如果它的任何参数是 NULL.
我建议您使用 CONCAT_WS() 而不是 COALESCE() 作为可能 NULL:

的列
SELECT 'id|countryCode|state|' AS `line` 
UNION ALL 
SELECT CONCAT_WS('|', `id`, COALESCE(`countryCode`, ''), COALESCE(`state`, '')) AS `line`
FROM `test`;

参见demo