Plsql pl/sql:将行聚合为varchar?

Plsql pl/sql:将行聚合为varchar?,plsql,multiple-columns,concat,Plsql,Multiple Columns,Concat,结果是: 如何将和和行聚合为varchar,以获得以下预期结果: SELECT concat(concat('m.', COLUMN_NAME), concat(' = mtf.', COLUMN_NAME)) A FROM all_tab_columns where table_name like 'T_EMPLOYEE' 试试这个。这可能会有帮助 由于11G,您可以使用该函数 -------------------------------PLSQL Starts------------

结果是:

如何将
和行聚合为varchar,以获得以下预期结果:

SELECT concat(concat('m.', COLUMN_NAME), concat(' = mtf.', COLUMN_NAME)) A
 FROM all_tab_columns
where table_name like 'T_EMPLOYEE' 
试试这个。这可能会有帮助

由于11G,您可以使用该函数

-------------------------------PLSQL Starts-----------------------------------------

set serveroutput on;
DECLARE
lv_cond LONG;
BEGIN
FOR i IN (
SELECT
  CASE
    WHEN ROWNUM =1
    THEN 'WHERE '
      ||concat(concat('m.', COLUMN_NAME), concat(' = mtf.', COLUMN_NAME))
    ELSE 'AND '
      ||concat(concat('m.', COLUMN_NAME), concat(' = mtf.', COLUMN_NAME))
  END col1
FROM all_tab_columns
WHERE table_name = 'EMP_V1') LOOP
lv_cond:=lv_cond||' '||i.col1;
END LOOP;
dbms_output.put_line(lv_cond);
END;

-------------------------------PLSQL Ends-----------------------------------------

SELECT
  CASE
    WHEN ROWNUM =1
    THEN 'WHERE '
      ||concat(concat('m.', COLUMN_NAME), concat(' = mtf.', COLUMN_NAME))
    ELSE 'AND '
      ||concat(concat('m.', COLUMN_NAME), concat(' = mtf.', COLUMN_NAME))
  END
FROM all_tab_columns
WHERE table_name = 'EMP_V1' ;

---------------------------------OUTPUT---------------------------------------------

COL1
WHERE m.EMPNO = mtf.EMPNO
AND m.ENAME = mtf.ENAME
AND m.JOB = mtf.JOB
AND m.MGR = mtf.MGR
AND m.HIREDATE = mtf.HIREDATE
AND m.SAL = mtf.SAL
AND m.COMM = mtf.COMM
AND m.DEPTNO = mtf.DEPTNO
AND m.NEWADD = mtf.NEWADD
------------------------------------------------------------------------------------
  • 我使用了
    |
    进行varchar连接(对我来说看起来有点干净)
  • CHR(13)| | CHR(10)
    是CRLF
  • 组内(按列ID排序)
    指定收集行以进行连接的顺序

我能知道如何合并成存储所有行的字符串吗@AvrajitRoyI使用PLSQL方法修改了答案,将其存储到变量中。你可以用VARCHAR2代替LONG。嘿,我可以知道为什么这个答案得到-15。concat函数不常用。通常的方法是级联运算符
| |
。特别是因为这样就不需要嵌套函数调用。查询的第一行是:
SELECT'm.| | | COLUMN| | | NAME'=mtf.| | COLUMN|u NAME A
-------------------------------PLSQL Starts-----------------------------------------

set serveroutput on;
DECLARE
lv_cond LONG;
BEGIN
FOR i IN (
SELECT
  CASE
    WHEN ROWNUM =1
    THEN 'WHERE '
      ||concat(concat('m.', COLUMN_NAME), concat(' = mtf.', COLUMN_NAME))
    ELSE 'AND '
      ||concat(concat('m.', COLUMN_NAME), concat(' = mtf.', COLUMN_NAME))
  END col1
FROM all_tab_columns
WHERE table_name = 'EMP_V1') LOOP
lv_cond:=lv_cond||' '||i.col1;
END LOOP;
dbms_output.put_line(lv_cond);
END;

-------------------------------PLSQL Ends-----------------------------------------

SELECT
  CASE
    WHEN ROWNUM =1
    THEN 'WHERE '
      ||concat(concat('m.', COLUMN_NAME), concat(' = mtf.', COLUMN_NAME))
    ELSE 'AND '
      ||concat(concat('m.', COLUMN_NAME), concat(' = mtf.', COLUMN_NAME))
  END
FROM all_tab_columns
WHERE table_name = 'EMP_V1' ;

---------------------------------OUTPUT---------------------------------------------

COL1
WHERE m.EMPNO = mtf.EMPNO
AND m.ENAME = mtf.ENAME
AND m.JOB = mtf.JOB
AND m.MGR = mtf.MGR
AND m.HIREDATE = mtf.HIREDATE
AND m.SAL = mtf.SAL
AND m.COMM = mtf.COMM
AND m.DEPTNO = mtf.DEPTNO
AND m.NEWADD = mtf.NEWADD
------------------------------------------------------------------------------------
SELECT LISTAGG(
         'm.' || COLUMN_NAME || ' = ' || 'mtf.' || COLUMN_NAME,
         CHR(13) || CHR(10) || 'AND ')
       WITHIN GROUP (ORDER BY COLUMN_ID)  A
FROM all_tab_columns
where table_name like 'T_EMPLOYEE'