如何使用oracle sql将两列拆分为两行?

如何使用oracle sql将两列拆分为两行?,sql,oracle,Sql,Oracle,例如,我有以下数据: column1 column2 column3 column4 column5 A B 5 2 3 我想要的表格是: columnA A B 确定拆分的条件是(第3列+第4列)>5,否则不进行拆分。union all: select column1 as columnA from t where column3 + column4

例如,我有以下数据:

column1    column2      column3    column4     column5
A            B             5          2           3
我想要的表格是:

columnA
A             
B

确定拆分的条件是(第3列+第4列)>5,否则不进行拆分。

union all

select column1 as columnA from t where column3 + column4 > 5 
union all
select column2 from t where column3 + column4 > 5 ;

union all

select column1 as columnA from t where column3 + column4 > 5 
union all
select column2 from t where column3 + column4 > 5 ;

我不确定我是否完全理解您在寻找什么,但是如果您想在SELECT中添加if,ele,您可能不想使用CASE表达式


我不确定我是否完全理解您要查找的内容,但是如果您想在SELECT中添加if,ele,则可能不想使用CASE表达式

对包含两行的派生表使用左联接(带联接条件)或交叉联接(无联接条件),然后通过大小写表达式输出值。这两种方法都允许在其他条件下访问所有列

Oracle 11g R2架构设置

CREATE TABLE TABLE1
    (COLUMN1 VARCHAR2(1), COLUMN2 VARCHAR2(1), COLUMN3 INT, COLUMN4 INT, COLUMN5 INT)
;

INSERT ALL 
    INTO TABLE1 (COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5)
         VALUES ('A', 'B', 5, 2, 3)
    INTO TABLE1 (COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5)
         VALUES ('C', 'D', 1, 1, 1)
SELECT * FROM DUAL
select
    case when lj.rn = 1 then t.column1 else t.column2 end as columnA
    , t.column1
    , t.column2
    , t.column3
    , t.column4
    , t.column5
from table1 t
left join ( select 1 as rn from dual union all select 2 from dual ) lj 
      on (column3 + column4) > 5 
| COLUMNA | COLUMN1 | COLUMN2 | COLUMN3 | COLUMN4 | COLUMN5 |
|---------|---------|---------|---------|---------|---------|
|       A |       A |       B |       5 |       2 |       3 |
|       B |       A |       B |       5 |       2 |       3 |
|       D |       C |       D |       1 |       1 |       1 |
| COLUMNA | COLUMN1 | COLUMN2 | COLUMN3 | COLUMN4 | COLUMN5 |
|---------|---------|---------|---------|---------|---------|
|       A |       A |       B |       5 |       2 |       3 |
|       B |       A |       B |       5 |       2 |       3 |
|       C |       C |       D |       1 |       1 |       1 |
|       D |       C |       D |       1 |       1 |       1 |
查询1

CREATE TABLE TABLE1
    (COLUMN1 VARCHAR2(1), COLUMN2 VARCHAR2(1), COLUMN3 INT, COLUMN4 INT, COLUMN5 INT)
;

INSERT ALL 
    INTO TABLE1 (COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5)
         VALUES ('A', 'B', 5, 2, 3)
    INTO TABLE1 (COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5)
         VALUES ('C', 'D', 1, 1, 1)
SELECT * FROM DUAL
select
    case when lj.rn = 1 then t.column1 else t.column2 end as columnA
    , t.column1
    , t.column2
    , t.column3
    , t.column4
    , t.column5
from table1 t
left join ( select 1 as rn from dual union all select 2 from dual ) lj 
      on (column3 + column4) > 5 
| COLUMNA | COLUMN1 | COLUMN2 | COLUMN3 | COLUMN4 | COLUMN5 |
|---------|---------|---------|---------|---------|---------|
|       A |       A |       B |       5 |       2 |       3 |
|       B |       A |       B |       5 |       2 |       3 |
|       D |       C |       D |       1 |       1 |       1 |
| COLUMNA | COLUMN1 | COLUMN2 | COLUMN3 | COLUMN4 | COLUMN5 |
|---------|---------|---------|---------|---------|---------|
|       A |       A |       B |       5 |       2 |       3 |
|       B |       A |       B |       5 |       2 |       3 |
|       C |       C |       D |       1 |       1 |       1 |
|       D |       C |       D |       1 |       1 |       1 |

CREATE TABLE TABLE1
    (COLUMN1 VARCHAR2(1), COLUMN2 VARCHAR2(1), COLUMN3 INT, COLUMN4 INT, COLUMN5 INT)
;

INSERT ALL 
    INTO TABLE1 (COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5)
         VALUES ('A', 'B', 5, 2, 3)
    INTO TABLE1 (COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5)
         VALUES ('C', 'D', 1, 1, 1)
SELECT * FROM DUAL
select
    case when lj.rn = 1 then t.column1 else t.column2 end as columnA
    , t.column1
    , t.column2
    , t.column3
    , t.column4
    , t.column5
from table1 t
left join ( select 1 as rn from dual union all select 2 from dual ) lj 
      on (column3 + column4) > 5 
| COLUMNA | COLUMN1 | COLUMN2 | COLUMN3 | COLUMN4 | COLUMN5 |
|---------|---------|---------|---------|---------|---------|
|       A |       A |       B |       5 |       2 |       3 |
|       B |       A |       B |       5 |       2 |       3 |
|       D |       C |       D |       1 |       1 |       1 |
| COLUMNA | COLUMN1 | COLUMN2 | COLUMN3 | COLUMN4 | COLUMN5 |
|---------|---------|---------|---------|---------|---------|
|       A |       A |       B |       5 |       2 |       3 |
|       B |       A |       B |       5 |       2 |       3 |
|       C |       C |       D |       1 |       1 |       1 |
|       D |       C |       D |       1 |       1 |       1 |
查询2

select
    case when cj.rn = 1 then t.column1 else t.column2 end as columnA
    , t.column1
    , t.column2
    , t.column3
    , t.column4
    , t.column5
from table1 t
cross join ( select 1 as rn from dual union all select 2 from dual ) cj

CREATE TABLE TABLE1
    (COLUMN1 VARCHAR2(1), COLUMN2 VARCHAR2(1), COLUMN3 INT, COLUMN4 INT, COLUMN5 INT)
;

INSERT ALL 
    INTO TABLE1 (COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5)
         VALUES ('A', 'B', 5, 2, 3)
    INTO TABLE1 (COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5)
         VALUES ('C', 'D', 1, 1, 1)
SELECT * FROM DUAL
select
    case when lj.rn = 1 then t.column1 else t.column2 end as columnA
    , t.column1
    , t.column2
    , t.column3
    , t.column4
    , t.column5
from table1 t
left join ( select 1 as rn from dual union all select 2 from dual ) lj 
      on (column3 + column4) > 5 
| COLUMNA | COLUMN1 | COLUMN2 | COLUMN3 | COLUMN4 | COLUMN5 |
|---------|---------|---------|---------|---------|---------|
|       A |       A |       B |       5 |       2 |       3 |
|       B |       A |       B |       5 |       2 |       3 |
|       D |       C |       D |       1 |       1 |       1 |
| COLUMNA | COLUMN1 | COLUMN2 | COLUMN3 | COLUMN4 | COLUMN5 |
|---------|---------|---------|---------|---------|---------|
|       A |       A |       B |       5 |       2 |       3 |
|       B |       A |       B |       5 |       2 |       3 |
|       C |       C |       D |       1 |       1 |       1 |
|       D |       C |       D |       1 |       1 |       1 |
对包含2行的派生表使用左联接(带联接条件)或交叉联接(无联接条件),然后通过大小写表达式输出值。这两种方法都允许在其他条件下访问所有列

Oracle 11g R2架构设置

CREATE TABLE TABLE1
    (COLUMN1 VARCHAR2(1), COLUMN2 VARCHAR2(1), COLUMN3 INT, COLUMN4 INT, COLUMN5 INT)
;

INSERT ALL 
    INTO TABLE1 (COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5)
         VALUES ('A', 'B', 5, 2, 3)
    INTO TABLE1 (COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5)
         VALUES ('C', 'D', 1, 1, 1)
SELECT * FROM DUAL
select
    case when lj.rn = 1 then t.column1 else t.column2 end as columnA
    , t.column1
    , t.column2
    , t.column3
    , t.column4
    , t.column5
from table1 t
left join ( select 1 as rn from dual union all select 2 from dual ) lj 
      on (column3 + column4) > 5 
| COLUMNA | COLUMN1 | COLUMN2 | COLUMN3 | COLUMN4 | COLUMN5 |
|---------|---------|---------|---------|---------|---------|
|       A |       A |       B |       5 |       2 |       3 |
|       B |       A |       B |       5 |       2 |       3 |
|       D |       C |       D |       1 |       1 |       1 |
| COLUMNA | COLUMN1 | COLUMN2 | COLUMN3 | COLUMN4 | COLUMN5 |
|---------|---------|---------|---------|---------|---------|
|       A |       A |       B |       5 |       2 |       3 |
|       B |       A |       B |       5 |       2 |       3 |
|       C |       C |       D |       1 |       1 |       1 |
|       D |       C |       D |       1 |       1 |       1 |
查询1

CREATE TABLE TABLE1
    (COLUMN1 VARCHAR2(1), COLUMN2 VARCHAR2(1), COLUMN3 INT, COLUMN4 INT, COLUMN5 INT)
;

INSERT ALL 
    INTO TABLE1 (COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5)
         VALUES ('A', 'B', 5, 2, 3)
    INTO TABLE1 (COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5)
         VALUES ('C', 'D', 1, 1, 1)
SELECT * FROM DUAL
select
    case when lj.rn = 1 then t.column1 else t.column2 end as columnA
    , t.column1
    , t.column2
    , t.column3
    , t.column4
    , t.column5
from table1 t
left join ( select 1 as rn from dual union all select 2 from dual ) lj 
      on (column3 + column4) > 5 
| COLUMNA | COLUMN1 | COLUMN2 | COLUMN3 | COLUMN4 | COLUMN5 |
|---------|---------|---------|---------|---------|---------|
|       A |       A |       B |       5 |       2 |       3 |
|       B |       A |       B |       5 |       2 |       3 |
|       D |       C |       D |       1 |       1 |       1 |
| COLUMNA | COLUMN1 | COLUMN2 | COLUMN3 | COLUMN4 | COLUMN5 |
|---------|---------|---------|---------|---------|---------|
|       A |       A |       B |       5 |       2 |       3 |
|       B |       A |       B |       5 |       2 |       3 |
|       C |       C |       D |       1 |       1 |       1 |
|       D |       C |       D |       1 |       1 |       1 |

CREATE TABLE TABLE1
    (COLUMN1 VARCHAR2(1), COLUMN2 VARCHAR2(1), COLUMN3 INT, COLUMN4 INT, COLUMN5 INT)
;

INSERT ALL 
    INTO TABLE1 (COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5)
         VALUES ('A', 'B', 5, 2, 3)
    INTO TABLE1 (COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5)
         VALUES ('C', 'D', 1, 1, 1)
SELECT * FROM DUAL
select
    case when lj.rn = 1 then t.column1 else t.column2 end as columnA
    , t.column1
    , t.column2
    , t.column3
    , t.column4
    , t.column5
from table1 t
left join ( select 1 as rn from dual union all select 2 from dual ) lj 
      on (column3 + column4) > 5 
| COLUMNA | COLUMN1 | COLUMN2 | COLUMN3 | COLUMN4 | COLUMN5 |
|---------|---------|---------|---------|---------|---------|
|       A |       A |       B |       5 |       2 |       3 |
|       B |       A |       B |       5 |       2 |       3 |
|       D |       C |       D |       1 |       1 |       1 |
| COLUMNA | COLUMN1 | COLUMN2 | COLUMN3 | COLUMN4 | COLUMN5 |
|---------|---------|---------|---------|---------|---------|
|       A |       A |       B |       5 |       2 |       3 |
|       B |       A |       B |       5 |       2 |       3 |
|       C |       C |       D |       1 |       1 |       1 |
|       D |       C |       D |       1 |       1 |       1 |
查询2

select
    case when cj.rn = 1 then t.column1 else t.column2 end as columnA
    , t.column1
    , t.column2
    , t.column3
    , t.column4
    , t.column5
from table1 t
cross join ( select 1 as rn from dual union all select 2 from dual ) cj

CREATE TABLE TABLE1
    (COLUMN1 VARCHAR2(1), COLUMN2 VARCHAR2(1), COLUMN3 INT, COLUMN4 INT, COLUMN5 INT)
;

INSERT ALL 
    INTO TABLE1 (COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5)
         VALUES ('A', 'B', 5, 2, 3)
    INTO TABLE1 (COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5)
         VALUES ('C', 'D', 1, 1, 1)
SELECT * FROM DUAL
select
    case when lj.rn = 1 then t.column1 else t.column2 end as columnA
    , t.column1
    , t.column2
    , t.column3
    , t.column4
    , t.column5
from table1 t
left join ( select 1 as rn from dual union all select 2 from dual ) lj 
      on (column3 + column4) > 5 
| COLUMNA | COLUMN1 | COLUMN2 | COLUMN3 | COLUMN4 | COLUMN5 |
|---------|---------|---------|---------|---------|---------|
|       A |       A |       B |       5 |       2 |       3 |
|       B |       A |       B |       5 |       2 |       3 |
|       D |       C |       D |       1 |       1 |       1 |
| COLUMNA | COLUMN1 | COLUMN2 | COLUMN3 | COLUMN4 | COLUMN5 |
|---------|---------|---------|---------|---------|---------|
|       A |       A |       B |       5 |       2 |       3 |
|       B |       A |       B |       5 |       2 |       3 |
|       C |       C |       D |       1 |       1 |       1 |
|       D |       C |       D |       1 |       1 |       1 |

假设我有带有样本数据的表
test

column1  |  column2  |  column3  |  column4  |  column5  
-------------------------------------------------------  
A        |  B        |  5        |  2        |  3  
C        |  D        |  1        |  1        |  1  
E        |  F        |  4        |  5        |  1  
用于上述示例数据的脚本:-

CREATE TABLE TEST  
(  
 column1 VARCHAR2(10),  
 column2 VARCHAR2(10),  
 column3 NUMBER(2),  
 column4 NUMBER(2),  
 column5 NUMBER(2)  
);  

INSERT INTO TEST VALUES('A','B',5,2,3);  
INSERT INTO TEST VALUES('C','D',1,1,1);  
INSERT INTO TEST VALUES('E','F',4,5,1);  
COMMIT;  
下面的查询将给出所需的输出:-

WITH tmp AS  
(SELECT (CASE   
          WHEN column3 + column4 > 5 THEN  
            column1||','||column2  
          ELSE  
            NULL  
        END) columna,  
        column1,column2,column3,column4,column5  
  FROM TEST)  
SELECT regexp_substr(columna,'[^,]+',1,LEVEL) columna,  
       column1,column2,column3,column4,column5  
  FROM tmp  
CONNECT BY LEVEL <= regexp_count(columna, ',') + 1  
    AND PRIOR column1 = column1  
    AND PRIOR dbms_random.random IS NOT NULL;

假设我有带有样本数据的表
test

column1  |  column2  |  column3  |  column4  |  column5  
-------------------------------------------------------  
A        |  B        |  5        |  2        |  3  
C        |  D        |  1        |  1        |  1  
E        |  F        |  4        |  5        |  1  
用于上述示例数据的脚本:-

CREATE TABLE TEST  
(  
 column1 VARCHAR2(10),  
 column2 VARCHAR2(10),  
 column3 NUMBER(2),  
 column4 NUMBER(2),  
 column5 NUMBER(2)  
);  

INSERT INTO TEST VALUES('A','B',5,2,3);  
INSERT INTO TEST VALUES('C','D',1,1,1);  
INSERT INTO TEST VALUES('E','F',4,5,1);  
COMMIT;  
下面的查询将给出所需的输出:-

WITH tmp AS  
(SELECT (CASE   
          WHEN column3 + column4 > 5 THEN  
            column1||','||column2  
          ELSE  
            NULL  
        END) columna,  
        column1,column2,column3,column4,column5  
  FROM TEST)  
SELECT regexp_substr(columna,'[^,]+',1,LEVEL) columna,  
       column1,column2,column3,column4,column5  
  FROM tmp  
CONNECT BY LEVEL <= regexp_count(columna, ',') + 1  
    AND PRIOR column1 = column1  
    AND PRIOR dbms_random.random IS NOT NULL;

但我有一个基于第3列和第4列的条件,但我有一个基于第3列和第4列的条件样本数据和期望的结果将有助于传达您想要做的事情。您所说的“否则不拆分”是什么意思?它们应该单独出现在输出上吗?在这种情况下,使用哪些列?样本数据和期望的结果将有助于传达您想要做的事情。您所说的“否则不拆分”是什么意思?它们应该单独出现在输出上吗?在这种情况下,使用哪些列?