首页 > 解决方案 > 如果列数据为空,则向左推送数据

问题描述

当我做:

SELECT * FROM myTable

6列表格

我得到这样的东西:

在此处输入图像描述

但我想得到这样的东西:

在此处输入图像描述

我尝试了以下方法:

SELECT COALESCE(NULLIF(col-1,''), 
                NULLIF(col-2,''), 
                NULLIF(col-3,''), 
                NULLIF(col-4,''), 
                NULLIF(col-5,''), NULLIF(col-6,''))

有了这个,我得到了第一个非空列,但是如果有的话,如何获得下一个?

还是有其他解决方案?

标签: sqloracle

解决方案


您可以取消透视数据,按将空值移动到最后一个位置的列对它们进行排序,然后再次旋转到原始形式:

select *
  from (
    select rn, row_number() over (partition by rn order by col) rc, val
      from (select rownum rn, col1, col2, col3, col4, col5, col6 from mytable)
      unpivot (val for col in (col1, col2, col3, col4, col5, col6)))
  pivot (max(val) for rc in (1 col1, 2 col2, 3 col3, 4 col4, 5 col5, 6 col6))

dbfiddle 演示

如果您id的表中有一些独特之处,请使用它而不是rn. 如果要根据数据而不是位置对数据进行排序,请更改order by. row_number()Pivot 和 unpivot 需要 Oracle 11 或更高版本。


推荐阅读