我需要查询,表格中有5列
select pos1,pos2,pos3,pos4,pos5 from ci_pos ;
在上面的字段中,任何两个都可以为null
例如
pos1='hyd'
pos2='blr'
pos3=null
pos4=null
pos5='Chn'
或其他例子
pos1='hyd'
pos2=null
pos3='blr'
pos4=null
pos5='chn'
或
pos1=null
pos2='hyd'
pos3='blr'
pos4=null
pos5='chn'
等所有上述情况。
我需要编写一个select查询,它将返回如下输出
示例:
pos1='hyd'
pos2='blr'
pos3=null
pos4=null
pos5='chn'
o / p应该是:
pos1='hyd'
pos2='blr'
pos3='Hyd'
pos4=null
pos5=null
示例2:
pos1='hyd'
pos2=null
pos3='blr'
pos4=null
pos5='chn'
输出
pos1='hyd'
pos2='blr'
pos3='chn'
pos4=null
pos5=null'
等
基本上我需要将最后两列设为null并将数据推送到上面的列。
答案 0 :(得分:0)
这可以通过 COALESCE 轻松实现,Oracle函数返回其第一个不是 NULL 的参数。如果您确定5列中只有2列 NULL ,那么以下代码将为您提供所需的输出:
with
test_data as (
select 'hyd' as pos1,
'blr' as pos2,
null as pos3,
null as pos4,
'chn' as pos5
from dual
union
select null as pos1,
null as pos2,
'hyd' as pos3,
'blr' as pos4,
'chn' as pos5
from dual
union
select 'hyd' as pos1,
null as pos2,
'blr' as pos3,
null as pos4,
'chn' as pos5
from dual)
select
coalesce(pos1, pos2, pos3, pos4, pos5) as pos1,
case
when pos1 is not null then coalesce(pos2, pos3, pos4)
when pos1 is null and pos2 is not null then nvl(pos3, pos4)
else pos4
end as pos2,
coalesce(pos5, pos4, pos3, pos2, pos1) as pos3,
null as pos4,
null as pos5
from test_data
;
说明:我们知道最后两列将是 NULL ,所以我们只返回 NULLs 。第一列和第二列很简单 - 只需获取第一列(pos1)的第一个非 NULL 值。对于第三列也是如此,但是按照检查列的相反顺序。
只有第二列需要进行一些检查 - 如果第一列不是 NULL ,那么最后一个值将位于pos2,pos3或pos4中。如果pos1 NULL ,而第二列不是,那么中间值将是pos3或pos4。否则,pos2值在pos4列中。
输出:
POS1 POS2 POS3 POS4 POS5
---- ---- ---- ---- ----
hyd blr chn
hyd blr chn
hyd blr chn