SQL使用相应的值连接多个列的字符串

时间:2015-10-20 06:36:18

标签: sql oracle db2 concat substr

我正在寻找一种在SELECT语句中实现此目的的方法。

FROM

Column1    Column2    Column3
A,B,C      1,2,3      x,y,z

Result
A|1|x,B|2|y,C|3|z

分隔符并不重要。我只是想把所有数据都放在一个列中。理想情况下,我希望在DB2中执行此操作。但是我想知道在Oracle中是否有更简单的方法来完成这项工作。 感谢

5 个答案:

答案 0 :(得分:1)

你可以使用INSTR和SUBSTR这样做:

   select 
   substr(column1,1,instr(column1,',',1)-1) || '|' ||
   substr(column2,1,instr(column2,',',1)-1) || '|' ||
   substr(column3,1,instr(column3,',',1)-1) || '|' ||
   ',' ||
   substr(column1 ,instr(column1 ,',',1,1)+1,instr(column1 ,',',1,2) - instr(column1 ,',',1)-1) || '|' || 
   substr(column2 ,instr(column2 ,',',1,1)+1,instr(column2 ,',',1,2) - instr(column2 ,',',1)-1) || '|' || 
   substr(column3 ,instr(column3 ,',',1,1)+1,instr(column3 ,',',1,2) - instr(column3 ,',',1)-1) || '|' || 
   ',' ||
   substr(column1 ,instr(column1 ,',',1,2)+1) || '|' || 
   substr(column2 ,instr(column2 ,',',1,2)+1) || '|' || 
   substr(column3 ,instr(column3 ,',',1,2)+1) 
   from yourtable

答案 1 :(得分:1)

我尝试了一些事情。只看一下link 首先,我创建了一个名为 t_ask_test 的表,并根据上述问题插入数据。使用字符串函数

实现了结果

样本表

book.author

插入一行

 create table t_ask_test(column1 varchar(10), column2 varchar(10),column3 varchar(10));

以下查询将采用动态方式

insert into T_ASK_TEST values ('A,B,C','1,2,3','x,y,z');

输出如下

select substr(column1,1,instr(column1,',',1,1)-1)||'|'||substr(column2,1,instr(column1,',',1,1)-1)||'|'||substr(column3,1,instr(column1,',',1,1)-1) ||','||
 substr(column1,instr(column1,',',1,1)+1,instr(column1,',',1,2)-instr(column1,',',1,1)-1)||'|'||substr(column2,instr(column2,',',1,1)+1,instr(column2,',',1,2)-instr(column2,',',1,1)-1)||'|'||substr(column3,instr(column3,',',1,1)+1,instr(column3,',',1,2)-instr(column3,',',1,1)-1) ||','||
 substr(column1,instr(column1,',',1,2)+1,length(column1)-instr(column1,',',1,2))||'|'||substr(column2,instr(column2,',',1,2)+1,length(column2)-instr(column2,',',1,2))||'|'||substr(column3,instr(column3,',',1,2)+1,length(column3)-instr(column3,',',1,2)) as test from t_ask_test;

答案 2 :(得分:1)

如果每行有一个动态的条目数,那么:

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE TEST ( Column1, Column2, Column3 ) AS
          SELECT 'A,B,C', '1,2,3', 'x,y,z' FROM DUAL
UNION ALL SELECT 'D,E', '4,5', 'v,w' FROM DUAL;

查询1

WITH ids AS (
  SELECT t.*, ROWNUM AS id
  FROM   TEST t
)
SELECT LISTAGG(
                   REGEXP_SUBSTR( i.Column1, '[^,]+', 1, n.COLUMN_VALUE )
         || '|' || REGEXP_SUBSTR( i.Column2, '[^,]+', 1, n.COLUMN_VALUE )
         || '|' || REGEXP_SUBSTR( i.Column3, '[^,]+', 1, n.COLUMN_VALUE )
       , ','
       ) WITHIN GROUP ( ORDER BY n.COLUMN_VALUE ) AS value
FROM   ids i,
       TABLE(
         CAST(
           MULTISET(
             SELECT LEVEL
             FROM   DUAL
             CONNECT BY LEVEL <= GREATEST(
               REGEXP_COUNT( i.COLUMN1, '[^,]+' ),
               REGEXP_COUNT( i.COLUMN2, '[^,]+' ),
               REGEXP_COUNT( i.COLUMN3, '[^,]+' )
             )
           )
           AS SYS.ODCINUMBERLIST
         )
       ) n
GROUP BY i.ID

<强> Results

|             VALUE |
|-------------------|
| A|1|x,B|2|y,C|3|z |
|       D|4|v,E|5|w |

答案 3 :(得分:0)

您需要使用:

  • SUBSTR
  • INSTR
  • || 连接运算符

如果你打破输出,然后了解它是如何工作的,那将很容易。

SQL> WITH t AS
  2    ( SELECT 'A,B,C' Column1, '1,2,3' Column2, 'x,y,z' Column3 FROM dual
  3    )
  4  SELECT SUBSTR(column1, 1, instr(column1, ',', 1) -1)
  5    ||'|'
  6    || SUBSTR(column2, 1, instr(column2, ',', 1) -1)
  7    ||'|'
  8    || SUBSTR(column3, 1, instr(column1, ',', 1) -1)
  9    ||','
 10    || SUBSTR(column1, instr(column1, ',', 1, 2) +1 - instr(column1, ',', 1),
 11                       instr(column1, ',', 1) -1)
 12    ||'|'
 13    || SUBSTR(column2, instr(column2, ',', 1, 2) +1 - instr(column2, ',', 1),
 14                       instr(column2, ',', 1) -1)
 15    ||'|'
 16    || SUBSTR(column3, instr(column3, ',', 1, 2) +1 - instr(column3, ',', 1),
 17                      instr(column3, ',', 1) -1)
 18    ||','
 19    || SUBSTR(column1, instr(column1, ',', 1, 3) +1 - instr(column1, ',', 1),
 20                       instr(column1, ',', 2) -1)
 21    as "new_column"
 22  FROM t;

new_column
-------------
A|1|x,B|2|y,C

另外,您应该避免在一列中存储分隔值。考虑规范化数据。

Oracle 11g 及更高版本,您可以使用上面的表达式创建 VIRTUAL COLUMN ,并使用它而不是经常执行 SQL

答案 4 :(得分:-1)

在oracle中非常简单。只需使用连接操作符||。  在下面的解决方案中,我使用下划线作为分隔符

select Column1 ||'_'||Column2||'_'||Column3 from table_name;