2015-12-16 49 views
1
SELECT concat(concat('m.', COLUMN_NAME), concat(' = mtf.', COLUMN_NAME)) A 
FROM all_tab_columns 
where table_name like 'T_EMPLOYEE' 

和我得到的結果是:enter image description herepl/sql:將行聚合成一個varchar?

如何聚集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 
+0

的'concat'功能是不經常使用的順序。通常的方法是連接運算符'||'。特別是因爲這消除了嵌套函數調用的需要。你的查詢的第一行是:'SELECT'm。' || COLUMN_NAME || '= mtf。' || COLUMN_NAME A' –

回答

1

試試這個。它可能有幫助。

-------------------------------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 
------------------------------------------------------------------------------------ 
+0

我可以知道如何連接成存儲所有行的字符串嗎? @AvrajitRoy – kmy

+0

我已經用PLSQL方法修改了答案,將它存儲到變量中。您可以使用VARCHAR2來代替LONG。 –

+0

嘿,我可以知道爲什麼我會得到-15這個答案。 –

1

由於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)指定在其中行被聚集級聯