如何将两列合并为一列并忽略空值-Oracle SQL developer
我使用的是Oracle SQL Developer,我有以下选择:如何将两列合并为一列并忽略空值-Oracle SQL developer,sql,oracle,join,concatenation,trim,Sql,Oracle,Join,Concatenation,Trim,我使用的是Oracle SQL Developer,我有以下选择: SELECT a1.numero_brevetto, a1.titolo, a2.descrizione, a1.data_scadenza_brevetto, listagg(a3.organizzazione, ', ') within group (order by a3.organizzazione) organizzazione_1,
SELECT a1.numero_brevetto,
a1.titolo,
a2.descrizione,
a1.data_scadenza_brevetto,
listagg(a3.organizzazione, ', ') within group (order by a3.organizzazione) organizzazione_1,
listagg(a4.ragione_sociale, ', ' ) within group (order by a4.ragione_sociale) organizzazione_2
FROM b_brevetto a1
FULL OUTER JOIN b_tipo_brevetto a2
ON a1.tipo_brevetto = a2.tipo_brevetto
LEFT JOIN b_brevetto_titolari a3
ON a1.codice_brevetto = a3.codice_brevetto
LEFT JOIN b_ditta a4
on a3.codice_ditta=a4.codice_ditta
WHERE a3.corrente = 1 AND a1.numero_brevetto = 'BREVETTO10000'
GROUP by a1.numero_brevetto,
a1.titolo,
a2.descrizione,
a1.data_scadenza_brevetto
ORDER BY a1.numero_brevetto
输出为:
NUMERO_BREVETTO TITOLO DESCRIZIONE DATA_SCAD ORGANIZZAZIONE_1 ORGANIZZAZIONE_2
---------------------- ----------------------------- ----------------------------- --------------- -------------------------------------- --------------------------------------------
BREVETTO10000 asdsad Brevetto italiano 18-FEB-39 (null) BAYER S.P.A.
从前面的选择开始,我想将Organizazione_1列的值与Organizazione_2的值连接起来。我希望获得以下输出:
NUMERO_BREVETTO TITOLO DESCRIZIONE DATA_SCAD ORGANIZZAZIONE_1_ORGANIZZAZIONE_2
---------------------- ----------------------------- ----------------------------- --------------- -------------------------------------- --------------------------------------------
BREVETTO10000 asdsad Brevetto italiano 18-FEB-39 BAYER S.P.A.
我尝试使用CONCAT函数:
SELECT a1.numero_brevetto,
a1.titolo,
a2.descrizione,
a1.data_scadenza_brevetto,
concat(concat(listagg(a3.organizzazione, ', ') within group (order by a3.organizzazione), ', '),
listagg(a4.ragione_sociale, ', ' ) within group (order by a4.ragione_sociale)) titolari
FROM b_brevetto a1
FULL OUTER JOIN b_tipo_brevetto a2
ON a1.tipo_brevetto = a2.tipo_brevetto
LEFT JOIN b_brevetto_titolari a3
ON a1.codice_brevetto = a3.codice_brevetto
LEFT JOIN b_ditta a4
on a3.codice_ditta=a4.codice_ditta
WHERE a3.corrente = 1 AND a1.numero_brevetto = 'BREVETTO10000'
GROUP by a1.numero_brevetto,
a1.titolo,
a2.descrizione,
a1.data_scadenza_brevetto
ORDER BY a1.numero_brevetto
但我有这个输出:
NUMERO_BREVETTO TITOLO DESCRIZIONE DATA_SCAD ORGANIZZAZIONE_1_ORGANIZZAZIONE_2
---------------------- ----------------------------- ----------------------------- --------------- -------------------------------------- --------------------------------------------
BREVETTO10000 asdsad Brevetto italiano 18-FEB-39 , BAYER S.P.A.
当ORGANIZZAZIONE_1列的值为空时,我想找到一种方法来删除“BAYER S.p.a.”附近多余的逗号(在本例中是如何删除的)。此外,如果列_organizazione_1没有空值,列Organizazione_1的所有值都为空值,我也会删除额外的逗号,例如:
NUMERO_BREVETTO TITOLO DESCRIZIONE DATA_SCAD ORGANIZZAZIONE_1 ORGANIZZAZIONE_2
---------------------- ----------------------------- ----------------------------- --------------- -------------------------------------- --------------------------------------------
BREVETTO20000 asdsad Brevetto italiano 18-FEB-59 PFIZER S.P.A. (null)
我想要:
NUMERO_BREVETTO TITOLO DESCRIZIONE DATA_SCAD ORGANIZZAZIONE_1_ORGANIZZAZIONE_2
---------------------- ----------------------------- ----------------------------- --------------- -------------------------------------- --------------------------------------------
BREVETTO10000 asdsad Brevetto italiano 18-FEB-39 PFIZER S.P.A.
NUMERO_BREVETTO TITOLO DESCRIZIONE DATA_SCAD ORGANIZZAZIONE_1_ORGANIZZAZIONE_2
---------------------- ----------------------------- ----------------------------- --------------- -------------------------------------- --------------------------------------------
BREVETTO10000 asdsad Brevetto italiano 18-FEB-39 PFIZER S.P.A., BAYER S.P.A., TEVA S.P.A.
最后,我想在两列都有值的情况下保留逗号:
NUMERO_BREVETTO TITOLO DESCRIZIONE DATA_SCAD ORGANIZZAZIONE_1 ORGANIZZAZIONE_2
---------------------- ----------------------------- ----------------------------- --------------- -------------------------------------- --------------------------------------------
BREVETTO10000 asdsad Brevetto italiano 18-FEB-39 PFIZER S.P.A. BAYER S.P.A., TEVA S.P.A.
我想要:
NUMERO_BREVETTO TITOLO DESCRIZIONE DATA_SCAD ORGANIZZAZIONE_1_ORGANIZZAZIONE_2
---------------------- ----------------------------- ----------------------------- --------------- -------------------------------------- --------------------------------------------
BREVETTO10000 asdsad Brevetto italiano 18-FEB-39 PFIZER S.P.A.
NUMERO_BREVETTO TITOLO DESCRIZIONE DATA_SCAD ORGANIZZAZIONE_1_ORGANIZZAZIONE_2
---------------------- ----------------------------- ----------------------------- --------------- -------------------------------------- --------------------------------------------
BREVETTO10000 asdsad Brevetto italiano 18-FEB-39 PFIZER S.P.A., BAYER S.P.A., TEVA S.P.A.
请帮帮我
附言:对不起,我的英语有多种方法可以做到这一点:
case when listagg(a3.organizzazione, ', ') within group (order by a3.organizzazione) is not null
then listagg(a3.organizzazione, ', ') within group (order by a3.organizzazione) || ','
end
||
listagg(a4.ragione_sociale, ', ' ) within group (order by a4.ragione_sociale)
或者最简单的方法是使用修剪
,如下所示:
trim(both ',' from
listagg(a3.organizzazione, ', ') within group (order by a3.organizzazione)
|| ','
|| listagg(a4.ragione_sociale, ', ' ) within group (order by a4.ragione_sociale)
)
您还可以组合两个nvl2函数,如下所示
选择a1.numero_brevetto,
a1.titolo,
a2.2.说明,
a1.1斯加登扎和布雷维托的数据,
集团内的nvl2(Listag(a3.Organizazione,,')(按a3.Organizazione排序)
,nvl2(集团内的列表(a4.ragione_sociale,,'))(按a4.ragione_sociale排序)
,listagg(a3.ORGANIZAZIONE,,')在集团内(按a3.ORGANIZAZIONE排序)
||组内的“,”| | listag(a4.ragione_sociale,,”)(按a4.ragione_sociale排序)
,listagg(a3.ORGANIZAZIONE,,')在集团内(按a3.ORGANIZAZIONE排序)
)
,listagg(a4.ragione_sociale,,')在集团内(按a4.ragione_sociale排序)
)Organizazione_1_Organizazione_2
从b_Brevet到a1
完全外部连接b_tipo_brevetto a2
关于a1.tipo_brevetto=a2.tipo_brevetto
左连接b_brevetto_titolari a3
关于a1.codice_brevetto=a3.codice_brevetto
左连接b_ditta a4
在a3上。密码=a4。密码
其中a3.corrente=1和a1.numero_brevetto='BREVETTO10000'
由a1.numero_brevetto分组,
a1.titolo,
a2.2.说明,
a1.data_scadenza_brevetto
由a1.numero_brevetto订购
;
要处理null,您需要一个函数。然后就是额外的空格和逗号。提示:a1
、a2
等都是糟糕的表别名。选择一些有意义的东西,例如b|ditta
的d
。带有|运算符的修剪函数非常有用。谢谢