需要有关将 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
,它将将该列值设置为 null
。 listagg
将忽略聚合
中的 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 缩小到最小的可重现示例有很大的好处。有时,当您删除不需要的位时,您可以看到更大的画面并注意到错误。有时,当你把东西拿出来的时候,你撤消了你没有完全理解的部分,因此你有更小的代码可以工作,也有更小的代码 + 只是多一点不起作用,这足以告诉你哪些命令需要重新阅读有助于理解交互。
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
,它将将该列值设置为 null
。 listagg
将忽略聚合
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 缩小到最小的可重现示例有很大的好处。有时,当您删除不需要的位时,您可以看到更大的画面并注意到错误。有时,当你把东西拿出来的时候,你撤消了你没有完全理解的部分,因此你有更小的代码可以工作,也有更小的代码 + 只是多一点不起作用,这足以告诉你哪些命令需要重新阅读有助于理解交互。