Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用listag和Regexp\u replace获取不同的值_Sql_Oracle_Plsql - Fatal编程技术网

Sql 如何使用listag和Regexp\u replace获取不同的值

Sql 如何使用listag和Regexp\u replace获取不同的值,sql,oracle,plsql,Sql,Oracle,Plsql,以下是我的疑问: 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\u 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\u replace进行此操作?任何其他功能/想法


提前感谢。

无需使用
REGEXP\u REPLACE
即可实现,例如使用
DISTINCT

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

无需使用
REGEXP\u REPLACE
即可实现,例如使用
DISTINCT

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

若您只寻找具有不同产品的一行,那个么卢卡斯的方法可以很好地工作

如果您确实需要任何其他摘要列,那么它可能不会满足您的需要。您可以改为使用此选项:

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;
我不建议删除
listag()
之后的重复项,如果只是因为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;

这将删除相邻的重复项。由于按排序,重复项是相邻的。所以,它应该是有效的。

若您只寻找具有不同产品的一行,那个么卢卡斯的方法很有效

如果您确实需要任何其他摘要列,那么它可能不会满足您的需要。您可以改为使用此选项:

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;
我不建议删除
listag()
之后的重复项,如果只是因为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;


这将删除相邻的重复项。由于按排序,重复项是相邻的。因此,它应该可以工作。

我还有其他列,我正在使用LISTAGG。这就是为什么我想在LISTAGG之后选择不同的值。我如何才能做到这一点?@user10273980一个不准确的问题将产生一个不准确的答案。。问题中没有任何内容表明使用多个列。。阅读“帮助他人重现问题”或“这就是为什么我想在LISTAGG之后选择不同的值。我如何才能做到这一点?”这不是很简单,那么你需要动态地将LISTAGG字符串转换回你不想这样做的记录。我还有其他列,我正在使用LISTAGG。这就是为什么我想在LISTAGG之后选择不同的值。我如何才能做到这一点?@user10273980一个不准确的问题将产生一个不准确的答案。。问题中没有任何内容表明使用多个列。。阅读“帮助他人重现问题”或“这就是为什么我想在LISTAGG之后选择不同的值。我如何才能做到这一点?”这不是很简单,那么您需要动态地将LISTAGG字符串转换回您不想这样做的记录。谢谢。我想在LISTAGG之后使用regexp\u replace实现这一点。这可能吗?@user10273980。为什么?这是一个非常简单的解决方案,我有以下几种情况:选择组(按名称排序)中的ID、CL_T、PG、listag(名称、chr(10))作为名称,组(按职务排序)中的listag(职务、chr(10))作为职务,组(按薪金排序)中的listag(薪金、chr(10))作为EMP集团按ID、CL_T、PG发放的工资,CL_T=按ID排列的“COMMT”顺序;我希望名称列具有不同的值,工作和薪水列具有Listag输出。谢谢。我想在LISTAGG之后使用regexp\u replace实现这一点。这可能吗?@user10273980。为什么?这是一个非常简单的解决方案,我有以下几种情况:选择组(按名称排序)中的ID、CL_T、PG、listag(名称、chr(10))作为名称,组(按职务排序)中的listag(职务、chr(10))作为职务,组(按薪金排序)中的listag(薪金、chr(10))作为EMP集团按ID、CL_T、PG发放的工资,CL_T=按ID排列的“COMMT”顺序;我需要具有不同值的名称列,以及具有LISTAGG输出的职务和薪资列。请发布输入数据。如果没有它,你很难给出你想要的答案。请发布输入数据。没有它,你很难给出你想要的答案。