【问题标题】:How to combine two columns into one and ignore null values - Oracle SQL developer如何将两列合二为一并忽略空值 - Oracle SQL 开发人员
【发布时间】:2021-02-03 09:23:04
【问题描述】:

我正在使用 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_" 全部为 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:对不起我的英语

【问题讨论】:

  • 要处理 null 你需要一个coalesce 函数。然后只需 trim 多余的空格和逗号。
  • 提示:a1a2 等是糟糕的表别名。选择有意义的东西,例如db_ditta

标签: sql oracle join concatenation trim


【解决方案1】:

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

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)
)

【讨论】:

  • 带有 || 的修剪功能接线员非常有帮助。谢谢
【解决方案2】:

你也可以像下面这样组合两个 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
;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    相关资源
    最近更新 更多