pl/sql :将行聚合到 varchar 中?
pl/sql : aggregate rows into a varchar?
SELECT concat(concat('m.', COLUMN_NAME), concat(' = mtf.', COLUMN_NAME)) A
FROM all_tab_columns
where table_name like 'T_EMPLOYEE'
我得到了结果:
如何将 AND
和行聚合到 varchar 中作为以下预期结果:
m.a_emp_id = mft.a_emp_id AND m.a_emp_name = mft.a_emp_name
AND m.a_emp_sal = mft.a_emp_sal AND m.a_emp_dept = mft.a_emp_dept
AND m.a_emp_status = mft.a_emp_status
Try this. It may help.
-------------------------------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
------------------------------------------------------------------------------------
从 11G 开始,您可以使用 LISTAGG 函数。
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'
- 我使用
||
进行 varchar 连接(对我来说看起来更简洁)。
CHR(13) || CHR(10)
是 CRLF
WITHIN GROUP (ORDER BY COLUMN_ID)
指定为串联收集行的顺序
SELECT concat(concat('m.', COLUMN_NAME), concat(' = mtf.', COLUMN_NAME)) A
FROM all_tab_columns
where table_name like 'T_EMPLOYEE'
我得到了结果:
如何将 AND
和行聚合到 varchar 中作为以下预期结果:
m.a_emp_id = mft.a_emp_id AND m.a_emp_name = mft.a_emp_name
AND m.a_emp_sal = mft.a_emp_sal AND m.a_emp_dept = mft.a_emp_dept
AND m.a_emp_status = mft.a_emp_status
Try this. It may help.
-------------------------------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
------------------------------------------------------------------------------------
从 11G 开始,您可以使用 LISTAGG 函数。
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'
- 我使用
||
进行 varchar 连接(对我来说看起来更简洁)。 CHR(13) || CHR(10)
是 CRLFWITHIN GROUP (ORDER BY COLUMN_ID)
指定为串联收集行的顺序