我有一个表,其中包含不同深度的空值:

dim col1 col2 col3 col4
v c b a NULL
x a NULL NULL NULL
y b a NULL NULL
z d c b a

有人知道我如何编写一条SELECT语句来通过空值来反转和折叠COLS吗?将最右边的第一个值作为新的最左边的值,实现此转换:

dim col1 col2 col3 col4
v a b c NULL
x a NULL NULL NULL
y a b NULL NULL
z a b c d

推荐答案

你可以用一些字符串连接所有的列,用一些常量如'null'替换NULL,提取null部分,反转非null部分, 再次用null连接reversed not null,分割得到一个数组,现在你可以得到数组元素作为列,不要忘记判断null并反转每个元素以正确地得到长于1个字符的值:

with 
test_data as (
select 'v' as dim, 'c' as col1, 'b' as col2,    'a' as col3,    NULL as col4 union all
select 'x', 'a', NULL,  NULL ,  NULL  union all
select 'y', 'b', 'a',   NULL ,  NULL  union all
select 'z', 'd', 'c',   'b',    'a'
)


select dim,
       case when reversed_array[0] = 'null' then null else reverse(reversed_array[0]) end as col1,
       case when reversed_array[1] = 'null' then null else reverse(reversed_array[1]) end as col2,
       case when reversed_array[2] = 'null' then null else reverse(reversed_array[2]) end as col3,
       case when reversed_array[3] = 'null' then null else reverse(reversed_array[3]) end as col4     
from
(
select dim,
split(
concat(
--all before |null
reverse(regexp_replace(concat_ws('|',nvl(col1,'null'), nvl(col2,'null'), nvl(col3,'null'), nvl(col4,'null')),'(\\|null)*','')),
--NULLs
regexp_extract(concat_ws('|',nvl(col1,'null'), nvl(col2,'null'), nvl(col3,'null'), nvl(col4,'null')),'((\\|null)*)$',1)
)
,'\\|') as reversed_array
from test_data
) s

结果:

dim     col1    col2    col3    col4    
v       a       b       c       NULL
x       a       NULL    NULL    NULL
y       a       b       NULL    NULL
z       a       b       c       d

Sql相关问答推荐

将SEMI JOIN、ANTI JOIN转换为非连接SQL

SQL JOIN of 2 Table with 2 sum

SQL(PostgreSQL)从条件创建点表

从列的不同值创建列

Postgres JSONB对象筛选

使用Lead获取下一个不同的日期

为什么在这种情况下我不能使用LAG函数?

如何根据计数和分组获取订单总数

Access VBA SQL命令INSERT FOR MULTIME VALUE

不同表达方式时的大小写

按分类标准检索记录

如何设计一个调用嵌套函数并仅在所有被调用的嵌套函数都提交时才提交的事务,例如,如果一个子函数失败则中止?

Postgres SQL查询从字符串中获取邮箱地址

Snowflake 中的分层数据

根据具有特定值的 ID 创建自定义组

如何在 SQL 中将两行(或多行)jsonb 数组合并为一行

按所选的值将记录分组到不同的列中

如何 Select 一列具有最小值而另一列具有给定值的记录?

为数组中的每个元素从表中收集最大整数

创建一个将层次 struct 级别放入列中的查询