繁体   English   中英

某种循环将 NULL 值移动到多列中的最后一列?

[英]Some sort of loop to move NULL values to last column in a number of columns?

我在查询中返回 4 列,每列都可以包含信息或为 NULL 值。 有没有办法创建某种循环,以便对于每一行,所有非 NULL 值都移动到最左边的列,最后有 NULL? 或者也许使用函数?

我的情况:

值 1 价值 2 价值 3 价值 4
5 3 无效的 1
6 无效的 无效的 3

我想要的结果:

值 1 价值 2 价值 3 价值 4
5 3 1 无效的
6 3 无效的 无效的

尽管有一些有趣的评论,但这可能在大多数 RDMS 中都可以做到,只要它们支持数组函数。 (它的完成方式会有所不同)。 我使示例表更复杂,以显示更多可能的情况。


架构 (PostgreSQL v13)

CREATE TABLE t (
  "value_1" INTEGER,
  "value_2" INTEGER,
  "value_3" INTEGER,
  "value_4" INTEGER
);

INSERT INTO t
  ("value_1", "value_2", "value_3", "value_4")
VALUES
  ('5', '3', null, '1'),
  ('6', null, null, '3'),
  ('3', '2', '1', '0'),
  (null, '2', null, '4'),
  (null, null, '3', '4'),
  (null, '3', '4', '5'),
  (null, null, null, '4');

询问

SELECT all_vals[1] Value_1
     , all_vals[2] Value_2
     , all_vals[3] Value_3
     , all_vals[4] Value_4
FROM (
    SELECT array_remove(ARRAY[value_1, value_2, value_3, value_4], NULL) all_vals
    FROM t
) arrs;
值_1 价值_2 值_3 value_4
5 3 1
6 3
3 2 1 0
2 4
3 4
3 4 5
4

在 DB Fiddle 上查看


架构 (MySQL v8.0)

CREATE TABLE t (
  `value_1` INTEGER,
  `value_2` INTEGER,
  `value_3` INTEGER,
  `value_4` INTEGER
);

INSERT INTO t
  (`value_1`, `value_2`, `value_3`, `value_4`)
VALUES
  ('5', '3', null, '1'),
  ('6', null, null, '3'),
  ('3', '2', '1', '0'),
  (null, '2', null, '4'),
  (null, null, '3', '4'),
  (null, '3', '4', '5'),
  (null, null, null, '4');

询问

SELECT all_values -> "$[0]" value_1
     , all_values -> "$[1]" value_2
     , all_values -> "$[2]" value_3
     , all_values -> "$[3]" value_4
FROM ( -- The Ordering here matters, as they appear to change the index when removed, so I had to work back to front. 
       -- $[4] (Or any value outside the range) is necessary, as a NULL will cause the whole thing to return NULL.
  SELECT JSON_REMOVE(JSON_ARRAY(value_1, value_2, value_3, value_4) 
                     , CASE WHEN value_4 IS NULL THEN "$[3]" ELSE "$[4]" END
                     , CASE WHEN value_3 IS NULL THEN "$[2]" ELSE "$[4]" END
                     , CASE WHEN value_2 IS NULL THEN "$[1]" ELSE "$[4]" END
                     , CASE WHEN value_1 IS NULL THEN "$[0]" ELSE "$[4]" END
                    ) all_values
  FROM t) arr;
值_1 价值_2 值_3 value_4
5 3 1
6 3
3 2 1 0
2 4
3 4
3 4 5
4

在 DB Fiddle 上查看

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM