为什么在 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
我知道的唯一解决方案是为每一列插入一个 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。
架构看起来像,
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
我知道的唯一解决方案是为每一列插入一个 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。