我有一张包含以下数据的表格
Column A Column B
-------------------------
1 POW
2 POW
1 POWPRO
1 PRO
2 PRO
1 PROUTL
1 TNEUTL
1 UTL
1 UTLTNE
我需要输出如下
输出
Column A Column B
1,2 POW,POWPRO,PRO,PROUTL,TNEUTL,UTL,UTLTNE
我试过以下查询。但输出是不同的。
select dbms_lob.substr( ltrim(REGEXP_REPLACE(REPLACE(
REPLACE(
XMLAGG(
XMLELEMENT("A",COLUMN_A )
ORDER BY COLUMN_A).getClobVal(),
'<A>',','),
'</A>',' '),'([^,]+)(,\1)+', '\1'),
dbms_lob.substr( ltrim(REGEXP_REPLACE(REPLACE(
REPLACE(
XMLAGG(
XMLELEMENT("A",COLUMN_B )
ORDER BY COLUMN_B).getClobVal(),
'<A>',','),
'</A>',' '),'([^,]+)(,\1)+', '\1') from table_name
但输出是
Column A Column B
-------------------------------------------------
1,2 POW ,POWPRO ,PROUTL ,TNEUTL ,UTLTNE
我想只使用regexp_replace来搜索模式。请帮帮我。
答案 0 :(得分:0)
我首先假设您的实际列名是A
和B
,而不是"Column A"
和"Column B"
。如果这个假设是错误的,你需要做的就是改变下面的名字。
您想要LIST_AGG
(适用于Oracle 11g及更高版本):
SELECT
LISTAGG(A, ',') WITHIN GROUP (ORDER BY A) AS A_VALUES
FROM TABLE_NAME;
不要被WITHIN GROUP
位抛出。这是一个“分析函数”,它只是Oracle其他DB调用窗口函数的名称。分析/窗口函数的基本思想是,它允许您访问相邻结果行中的数据以确定当前行的值。他们所擅长的一个简单例子是累计金额。
在这种情况下,它的分析/窗口是多余的。我们只是用它来聚合。但是,我们必须提供WITHIN GROUP
部分,以防止语法错误。我们告诉它要按列表排序的内容,在这种情况下只是我们聚合的列。您可以使用分析/窗口函数做更多事情,但这不是重复这些功能的地方。
由于您需要DISTINCT
值,事情会变得复杂一些:
SELECT
LISTAGG(A, ',') WITHIN GROUP (ORDER BY A) AS A_VALUES
FROM (
SELECT DISTINCT A
FROM TABLE_NAME
);
因为你想要两个列,所以更加复杂:
SELECT *
FROM (
SELECT
LISTAGG(A, ',') WITHIN GROUP (ORDER BY A) AS A_VALUES
FROM (
SELECT DISTINCT A
FROM TABLE_NAME
)
) A_VALS,
(
SELECT
LISTAGG(B, ',') WITHIN GROUP (ORDER BY B) AS B_VALUES
FROM (
SELECT DISTINCT B
FROM TABLE_NAME
)
) B_VALS
这最后一个可以回复你想要的东西。它只是从子查询中每列的不同值创建一个字符串,然后它执行完整连接(逗号,因为没有过滤器)将两列放在一起。每个子查询都返回一行,因此您只能在最终结果中获得一行。
答案 1 :(得分:0)
您可以使用Oracles系列。与CAST()
配对的COLLECT()
可以将值聚合到用户定义的集合中,然后SET()
将删除重复项。然后,您可以使用LISTAGG()
将集合转换为字符串。
Oracle安装程序:
CREATE TYPE intlist IS TABLE OF INT;
/
CREATE TYPE stringlist IS TABLE OF VARCHAR2(4000);
/
CREATE TABLE table_name ( ColA NUMBER(5,0), ColB VARCHAR2(20) );
INSERT INTO table_name
SELECT 1, 'POW' FROM DUAL UNION ALL
SELECT 2, 'POW' FROM DUAL UNION ALL
SELECT 1, 'POWPRO' FROM DUAL UNION ALL
SELECT 1, 'PRO' FROM DUAL UNION ALL
SELECT 2, 'PRO' FROM DUAL UNION ALL
SELECT 1, 'PROUTL' FROM DUAL UNION ALL
SELECT 1, 'TNEUTL' FROM DUAL UNION ALL
SELECT 1, 'UTL' FROM DUAL UNION ALL
SELECT 1, 'UTLTNE' FROM DUAL;
<强>查询强>:
SELECT ( SELECT LISTAGG( COLUMN_VALUE, ',' )
WITHIN GROUP ( ORDER BY COLUMN_VALUE )
FROM TABLE( ColA ) ) AS ColA,
( SELECT LISTAGG( COLUMN_VALUE, ',' )
WITHIN GROUP ( ORDER BY COLUMN_VALUE )
FROM TABLE( ColB ) ) AS ColB
FROM (
SELECT SET( CAST( COLLECT( ColA ORDER BY ColA ) AS INTLIST ) ) ColA,
SET( CAST( COLLECT( ColB ORDER BY ColB ) AS STRINGLIST ) ) ColB
FROM table_name
);
<强>输出强>:
ColA ColB
---- ---------------------------------------
1,2 POW,POWPRO,PRO,PROUTL,TNEUTL,UTL,UTLTNE