繁体   English   中英

如何使用LISTAGG和Regexp_replace获得不同的值

[英]How to get distinct values using LISTAGG and Regexp_replace

以下是我的查询:

SELECT LISTAGG(product_name, chr(10)) WITHIN GROUP (ORDER BY product_name) "Product_Listing"
FROM products;

查询的输出是:

apple
orange
apple
mango
orange
banana
banana
apple

所需的输出是:

apple
orange
mango
banana

如何为此使用regexp_replace? 任何其他功能/想法。

提前致谢。

不用REGEXP_REPLACE就可以实现,例如使用DISTINCT

SELECT LISTAGG(product_name, chr(10)) WITHIN GROUP (ORDER BY product_name) 
       "Product_Listing" 
FROM (SELECT DISTINCT product_name FROM products) s;

DBFiddle演示

如果您只想寻找与众不同的产品,那么Lukasz的方法很好用。

如果您实际上还需要其他任何摘要列,那么它可能不会满足您的要求。 您可以改用以下方法:

SELECT LISTAGG(CASE WHEN seqnum = 1 THEN product_name END, chr(10))
           WITHIN GROUP (ORDER BY product_name) as Product_Listing
FROM (SELECT p.*,
             ROW_NUMBER() OVER (PARTITION BY product_name ORDER BY product_name) as seqnum
      FROM products p
     ) p;

我不建议在LISTAGG() 之后删除重复项,仅因为Oracle对结果强加了很短的限制。 但是您可以按照以下方式进行操作:

SELECT REGEXP_REPLACE(LISTAGG(product_name END, chr(10)) WITHIN GROUP (ORDER BY product_name),
                      '([^\x10]+)(\x10\1)+',
                      '\1'
                     ) as Product_Listing
FROM products p;

这将删除相邻的重复项。 由于ORDER BY ,重复项是相邻的。 因此,它应该工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM