gpt4 book ai didi

mysql - 从每一列的选定行中获取第一个非空值

转载 作者:行者123 更新时间:2023-11-30 21:27:09 43 4
gpt4 key购买 nike

我正在尝试创建一个查询,该查询可以为表中的选定列获取第一个非空值。由于我有太多列,所以我无法触发多个查询并按每一列合并它。我尝试使用一些 SO 问题的答案来创建查询。但它对我不起作用。

示例表

| orders| id   | default_address ||-------|------|-----------------|| 1     | 1    | null            || 2     | null | null            || 3     | 2    | 3               |

预期结果

| id | default_address ||----|-----------------|| 1  | 3               |

另一个示例表

| orders| id   | default_address ||-------|------|-----------------|| 1     | 1    | null            || 2     | null | 5               || 3     | 2    | 3               |

预期结果

| id | default_address ||----|-----------------|| 1  | 5               |

我试过的就在这里

http://sqlfiddle.com/#!9/84a5c/1

http://sqlfiddle.com/#!9/574481/2

最佳答案

假设您使用的是 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值(value)。

对于早期的 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;

关于mysql - 从每一列的选定行中获取第一个非空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58372529/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com