mysql - 为什么在 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
解决方案
我知道的唯一解决方案是为每列 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`;
推荐阅读
- dart - 如何将列最大高度限制为屏幕高度?即让孩子“match_parent”大小
- excel - SAP 脚本随着时间的推移运行缓慢 VBA
- kubernetes - 使用 Helm 图表对 Kafka 进行分区重新分配
- keras - 序列到序列模型表现不佳
- java - += 带有字符串和强制转换字符的运算符
- java - 离线应用程序的 Firestore 中的数据存储
- api - Jenkins - 如何使用 curl、http 发送布尔参数?
- javascript - 如何在 Vue.js 中将 InnerHtml 复制到剪贴板?
- r - 使用 Rselenium 时 CSS 选择器不起作用
- c# - Botframework V4:DateTimePrompt 没有得到结果