需要有关将 LISTAGG 与正则表达式一起使用的指导

Need guidance in using LISTAGG with Regular Expression

SELECT
         ID_Col,
         lower(LISTAGG(distinct TEXT_COL,',')WITHIN GROUP(ORDER BY TEXT_COL)) 
         AS TEXT_COL_TXT
         FROM
         (SELECT
          CREATE_DT,
          ID_Col,
          TEXT_COL,
          TRY_CAST(Q_NO as INTEGER) as Q_NO
          FROM db_name.schema_name.tbl_name
          WHERE Flg = '0'
          AND date_of_cr = '2022-02-05'
          AND P_CODE NOT IN ('1','2','3','4')
          AND ID_Col IN('12345','23456')
          ORDER BY Q_NO)
          GROUP BY 1;

当我运行上面的查询时,我得到这样的结果:

ID_COL                                        TEXT_COL

12345                                 ::abcd::0,aforapple
23456                                 ::abcd::0,n:sometext:::empty::

我希望在结果中删除该值 --> ::abcd::0,

结果应如下所示:

ID_COL                                   TEXT_COL

12345                                 aforapple
23456                                 n:sometext:::empty::

谁能指导我如何得到这样的结果?

当我使用以下逻辑时,我现在可以在结果中看到逗号:

LISTAGG(distinct iff(TEXT_COL = '::abcd::0', '', TEXT_COL),',')

我能看到的结果是:

ID_COL                                   TEXT_COL

12345                                 ,aforapple
23456                                 ,n:sometext:::empty::

我不应该在结果中显示逗号

尝试应用 IFF(),这类似于 CASE WHEN: https://docs.snowflake.com/en/sql-reference/functions/iff.html

LISTAGG(distinct iff(TEXT_COL = '::abcd::0', '', TEXT_COL),',')

逻辑描述: If TEXT_COL = THEN 使用空字符串 ELSE 在 LISTAGG

中使用 TEXT_COL 进行连接

您可以使用 nullif,如果它匹配 ::abcd::0,它将将该列值设置为 nulllistagg 将忽略聚合

中的 nulls
listagg(distinct nullif(text_col,'::abcd::0'),',') within group (order by text_col)

如果你开始就好了accepting answershttps://whosebug.com/help/accepted-answer

如果你发布了最低要求也很好SQL。

所以你发布了 SQL

SELECT
    ID_Col,
    lower(LISTAGG(distinct TEXT_COL,',') WITHIN GROUP (ORDER BY TEXT_COL)) AS TEXT_COL_TXT
FROM
(
    SELECT
        CREATE_DT,
        ID_Col,
        TEXT_COL,
        TRY_CAST(Q_NO as INTEGER) as Q_NO
    FROM db_name.schema_name.tbl_name
    WHERE Flg = '0'
        AND date_of_cr = '2022-02-05'
        AND P_CODE NOT IN ('1','2','3','4')
        AND ID_Col IN('12345','23456')
    ORDER BY Q_NO
)
GROUP BY 1;

因此,由于您对 db_name.schema_name.tbl_name 的过滤器对 LISTAGG 问题的影响为零,因此可以删除这些过滤器。 ORDER BY 应该被删除,例如 SQL-Server 将使这个 SQL 失败,因为订购 sub-select 没有多大意义。这样就可以变成:

SELECT
    ID_Col,
    lower(LISTAGG(distinct TEXT_COL,',') WITHIN GROUP (ORDER BY TEXT_COL)) AS TEXT_COL_TXT
FROM
(
    SELECT
        ID_Col,
        TEXT_COL,
    FROM db_name.schema_name.tbl_name
)
GROUP BY 1;

但实际上可以变成:

SELECT
    ID_Col,
    lower(LISTAGG(distinct TEXT_COL,',') WITHIN GROUP (ORDER BY TEXT_COL)) AS TEXT_COL_TXT
FROM db_name.schema_name.tbl_name
GROUP BY 1;

现在如果你想成为朋友,你可以在 table

中提供一些工作数据
ID_COL TEXT_COL
12345 ::abcd::0
12345 aforapple
23456 ::abcd::0
23456 n:sometext:::empty::

您可以在您提供的小示例查询中提供数据:

SELECT
    column1,
    lower(LISTAGG(distinct column2,',') WITHIN GROUP (ORDER BY column2)) AS TEXT_COL_TXT
FROM VALUES
    (12345, '::abcd::0'),
    (12345, 'aforapple'),
    (23456, '::abcd::0'),
    (23456, 'n:sometext:::empty::')
GROUP BY 1;

将您的 SQL 缩小到最小的可重现示例有很大的好处。有时,当您删除不需要的位时,您可以看到更大的画面并注意到错误。有时,当你把东西拿出来的时候,你撤消了你没有完全理解的部分,因此你有更小的代码可以工作,也有更小的代码 + 只是多一点不起作用,这足以告诉你哪些命令需要重新阅读有助于理解交互。