如何在oracle sql中创建不同的值?
我的表结构如下:
| 用户|acc_1|acc_2|acc_3|acc_4|
| --------------|--------------|--------------|--------------|--------------|
| 1|T1|T1|||
| 二|T2||T2|T2|
| 三||T3|||
create table myTable (user, acc_1, acc_2,acc_3,acc_4) as
select 1, t1, t1, null,null from dual union all
select 2, t2, null, t2,t2 from dual union all
select 3, null, t3, null,null from dual ;
当我运行查询时:
select user, acc_1 || ','||acc_2||','||acc_3||','||acc_4 as acc
from myTable
我得到的输出为:
| 用户|行政协调委员会|
| --------------|--------------|
| 1|t1,t1,,|
| 二|t2,,t2,t2|
| 三|,t3,,|
但我不需要acc. I的重复我需要我的输出为:
| 用户|行政协调委员会|
| --------------|--------------|
| 1|T1|
| 二|T2|
| 三|T3|
这可能吗?
3条答案
按热度按时间slhcrj9b1#
最简单的方法是“unpivot”你的数据,并将其视为行。例如:
在这里,我将数据转换为行,并使用
LISTAGG(DISTINCT ...)
连接它们。演示here。
当然,你也可以在这里使用
UNPIVOT
。**编辑:**正如@Littlefoot正确指出的,建议的解决方案不适用于旧版本的Oracle。对于旧版本的Oracle,可以使用
UNION
代替UNION ALL
,并在聚合函数中跳过DISTINCT
。qcbq4gxm2#
给定样本数据:
您可以使用
CASE
表达式(这是更多的类型,但只需要一个表扫描,并使用简单,快速的比较):其输出:
| 使用者|账户|
| --------------|--------------|
| 1|t1,|
| 二|t2,|
| 三|t3,|
RTRIM
(或SUBSTR
,如果帐户号码可能包含逗号,则直到倒数第二个字符)。或者,unpivot和重新聚合行(这要少得多,但与使用
CASE
表达式在初始行上执行所有操作相比,unpivot和重新聚合的效率要低得多):其输出:
| 使用者|账户|
| --------------|--------------|
| 1|T1|
| 二|T2|
| 三|T3|
fiddle
yjghlzjz3#
只需使用
COALESCE
为每个用户选择第一个非空的acc值: