在一个栏中将案例和Coalese结合在一起

时间:2019-03-04 18:11:33

标签: sql oracle

我有一个要合并的两列查询

Select 
  CASE WHEN ORGNBR IS NULL THEN ‘P’
       WHEN PERSNBR IS NULL THE. ‘O’
       Else null end as “owner”
  , coalesce (orgnbr,persnbr) as “owner num”
From table 

结果

Owner  | Owner Num
  O    | 12345
  P    | 12899

为每个人/组织分配了一个号码,我希望能够通过在组织号前面加上0并在人nnbr前面加上P来从一个人中识别组织

我要合并这两行,以便结果将O放在ORGNBR的前面,将P I放在PERSNBR的前面

预期结果

 Owner  
  O  12345
  P 12899

3 个答案:

答案 0 :(得分:1)

嗯。 。 。我想我将其表达为:

SELECT (CASE WHEN ORGNBR IS NOT NULL THEN 'O' || orgnbr
             WHEN PERSNBR IS NOT NULL THEN 'P' || persnbr
        END) as owner
FROM table ;

(您可以根据需要添加其他列。)

重要的是,这改变了逻辑,因此它是“正”而不是“负”。也就是说,条件是“如果存在orgnbr,则在'O'前面”,而不是“如果没有orgnbr,则在'P'之间”。后者更难遵循,并且不能轻易允许更多类别。

这还使用了concat运算符,在Oracle中口语化程度更高。

答案 1 :(得分:0)

您似乎想要concat

Select 
  CASE WHEN ORGNBR IS NULL THEN 'P'
       WHEN PERSNBR IS NULL THEN 'O'
       Else null end  || coalesce (orgnbr,persnbr) as combine_row
From table 

答案 2 :(得分:0)

据我对问题的了解,使用nvl2是您所需要的:

with t(orgnbr,persnbr) as
(
 select  null, 12345 from dual union all
 select 12899, null  from dual 
)    
select nvl2(persnbr,'O'||persnbr,'P'||orgnbr) as "Result"
  from t;

Result
O12345
P12899