如何将两列合并为一列并忽略空值 - Oracle SQL 开发人员
How to combine two columns into one and ignore null values - Oracle SQL developer
我正在使用 Oracle SQL Developer 并且我有以下 select:
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.
从前面的 select 开始,我想将 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_" 全部为 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.
请帮帮我
P.S:对不起我的英语
有多种方法可以做到这一点:
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
;
我正在使用 Oracle SQL Developer 并且我有以下 select:
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.
从前面的 select 开始,我想将 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_" 全部为 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.
请帮帮我 P.S:对不起我的英语
有多种方法可以做到这一点:
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
;