sql >> Databasteknik >  >> RDS >> Oracle

Sammanfoga värden från flera kolumner i Oracle

SQL Fiddle

Oracle 11g R2 Schema Setup :

CREATE TABLE test (col1, col2, col3, col4, col5 ) AS
          SELECT 1, 'A', 'B', 'C', 'D' FROM DUAL
UNION ALL SELECT 2, 'A', 'B', 'C', NULL FROM DUAL
UNION ALL SELECT 3, 'C', 'A', NULL, NULL FROM DUAL
UNION ALL SELECT 4, 'D', 'A', 'C', NULL FROM DUAL
UNION ALL SELECT 5, NULL, NULL, NULL, NULL FROM DUAL
UNION ALL SELECT 6, NULL, NULL, NULL, 'A' FROM DUAL
UNION ALL SELECT 7, 'B', NULL, NULL, 'A' FROM DUAL
UNION ALL SELECT 8, NULL, 'C', NULL, 'A' FROM DUAL;

Fråga 1 :

Om det inte finns någon NULL värden mellan andra värden (det kommer att införa flera kommatecken på raderna 7 och 8):

SELECT col1,
       TRIM( ',' FROM col2||','||col3||','||col4||','||col5 ) AS col2
FROM   test

Resultat :

| COL1 |    COL2 |
|------|---------|
|    1 | A,B,C,D |
|    2 |   A,B,C |
|    3 |     C,A |
|    4 |   D,A,C |
|    5 |  (null) |
|    6 |       A |
|    7 |   B,,,A |
|    8 |    C,,A |

De två sista frågorna kommer att fungera för alla exempel:

Fråga 2 :

SELECT col1,
       TRIM( ',' FROM col2 || NVL2( col3, ','||col3, NULL ) || NVL2( col4, ','||col4, NULL ) || NVL2( col5, ','||col5, NULL ) ) AS col2
FROM   test

Resultat :

| COL1 |    COL2 |
|------|---------|
|    1 | A,B,C,D |
|    2 |   A,B,C |
|    3 |     C,A |
|    4 |   D,A,C |
|    5 |  (null) |
|    6 |       A |
|    7 |     B,A |
|    8 |     C,A |

Fråga 3 :

SELECT col1,
       REGEXP_REPLACE( col2||','||col3||','||col4||','||col5, '(^|,),+|,+($)', '\1' ) AS col2
FROM   test

Resultat :

| COL1 |    COL2 |
|------|---------|
|    1 | A,B,C,D |
|    2 |   A,B,C |
|    3 |    C,A, |
|    4 |   D,A,C |
|    5 |  (null) |
|    6 |       A |
|    7 |     B,A |
|    8 |     C,A |


  1. Sammanfoga en sträng och primärnyckel-ID vid infogning

  2. Kaskad radera fråga

  3. tsector stöder bara engelska?

  4. SQL-skript för att skapa infogningsskript