首页 > 解决方案 > 为什么在 MySQL 上使用 UNION ALL 时,空记录会导致整行为空?

问题描述

架构看起来像,

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*

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

所需的输出是,

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

小提琴手

标签: mysqlmysql-8.0

解决方案


我知道的唯一解决方案是为每列 eG 插入一个 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`;

推荐阅读