OracleSQL:如果值为空,则检索相邻字段的值

时间:2019-05-13 07:02:48

标签: sql oracle

我有一个大表A,并且如果当前字段(文本)为空,则需要获取组(列:键)中一个已填充的相邻字段(代码:K_P_1)的值。组不一定具有代码为K_P_1的字段。我的查询中有很多联接,希望下面的最小示例使我的问题更紧密。

我的事:我实际上以为我可以通过正确的外部联接来解决我的问题,但是我不知道该组合什么钥匙。当我遍历case语句时,我缺少对相邻字段的引用。

我的表A:

select Key, Code, Text from A;

Key Code  Text  
11K K_P_1 text  
11K K_P_2 (null)
11K K_P_3 (null)    
12K K_P_1 text2
12K K_P_2 (null)
12K K_P_3 (null)

我的预期视图:

Key Code  Text   FamilyText
11K K_P_1 text   text
11K K_P_2 (null) text
11K K_P_3 (null) text   
12K K_P_1 text2  text2
12K K_P_2 (null) text2
12K K_P_3 (null) text2

2 个答案:

答案 0 :(得分:2)

您可以使用窗口函数FIRST_VALUE

SELECT tab.*, 
       FIRST_VALUE(Text IGNORE NULLS) OVER(PARTITION BY Key ORDER BY Code) AS FamilyText
FROM tab;

答案 1 :(得分:1)

with s (Key, Code, Text) as (
select '11K', 'K_P_1', 'text'  from dual union all
select '11K', 'K_P_2', null    from dual union all
select '11K', 'K_P_3', null    from dual union all
select '12K', 'K_P_1', 'text2' from dual union all
select '12K', 'K_P_2', null    from dual union all
select '12K', 'K_P_3', null    from dual)
select s.*, lag(text ignore nulls, 1, text) over (partition by key order by code) FamilyText
from s;

KEY CODE  TEXT  FAMIL
--- ----- ----- -----
11K K_P_1 text  text 
11K K_P_2       text 
11K K_P_3       text 
12K K_P_1 text2 text2
12K K_P_2       text2
12K K_P_3       text2

6 rows selected.