我正在尝试创建一个查询,该查询可以为表中的选定列获取First Non-null值。我无法触发多个查询,也无法为每列合并它,因为我有很多列。我试图使用一些SO问题的答案来创建查询。但这对我不起作用。
示例表
| 订单| id | default_address | | ------- | ------ | ----------------- | | 1 | 1 | 空| | 2 | 空| 空| | 3 | 2 | 3 |
预期结果
| id | default_address | | ---- | ----------------- | | 1 | 3 |
另一个示例表
| 订单| id | default_address | | ------- | ------ | ----------------- | | 1 | 1 | 空| | 2 | 空| 5 | | 3 | 2 | 3 |
预期结果
| id | default_address | | ---- | ----------------- | | 1 | 5 |
我尝试过的在这里
假设您使用的是MySQL 8+,这是使用解析函数执行此操作的一种方法:
WITH cte AS (
SELECT *,
COUNT(id) OVER (ORDER BY orders) cnt_id,
COUNT(default_address) OVER (ORDER BY orders) cnt_addr
FROM yourTable
)
SELECT
MAX(CASE WHEN cnt_id = 1 THEN id END) AS id,
MAX(CASE WHEN cnt_addr = 1 THEN default_address END) AS default_address
FROM cte;
假设实际存在第三列orders
,该列将生成示例数据中显示的顺序。
此技巧有效,因为COUNT()
默认情况下该函数仅计算非NULL
值。因此,使用按orders
列给出的顺序使用窗口函数时,第一个非NULL
值将仅等于1 。
对于早期的MySQL版本:
SELECT
MAX(id) AS id,
MAX(default_address) AS default_address
FROM
(
SELECT
CASE WHEN (SELECT COUNT(t2.id) FROM yourTable t2
WHERE t2.orders <= t1.orders) = 1 THEN id END AS id,
CASE WHEN (SELECT COUNT(t2.default_address) FROM yourTable t2
WHERE t2.orders <= t1.orders) = 1 THEN default_address END AS default_address
FROM yourTable t1
) t;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句