如何将两列合并为一列并忽略空值- Oracle SQL开发人员



我正在使用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,
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.

从前面的选择开始,我想将列Organizzazione_1的值与Organizzazione_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.

我想找到一种方法来删除&;BAYER S.P.A.&;旁边的额外逗号。当列ORGANIZZAZIONE_1具有NULL值时(在本例中如何)。此外,如果column_ORGANIZZAZIONE_1具有NOT NULL值并且列ORGANIZZAZIONE_"all NULL VALUE,例如:

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.

请帮帮我附言:对不起,我的英语

有多种方法可以做到这一点:

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如下:

trim(both ',' from
listagg(a3.organizzazione, ', ') within group (order by a3.organizzazione)
|| ','
|| listagg(a4.ragione_sociale, ', ' ) within group (order by a4.ragione_sociale)
)

您也可以像下面这样组合两个nvl2函数。

SELECT a1.numero_brevetto,
a1.titolo,
a2.descrizione,
a1.data_scadenza_brevetto,
nvl2(listagg(a3.organizzazione, ', ') within group (order by a3.organizzazione)
,  nvl2(listagg(a4.ragione_sociale, ', ' ) within group (order by a4.ragione_sociale)
,   listagg(a3.organizzazione, ', ') within group (order by a3.organizzazione)
||', '||listagg(a4.ragione_sociale, ', ' ) within group (order by a4.ragione_sociale)
,   listagg(a3.organizzazione, ', ') within group (order by a3.organizzazione)
)
,  listagg(a4.ragione_sociale, ', ' ) within group (order by a4.ragione_sociale)
) organizzazione_1_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
;

最新更新