Oracle 将一列转换为两列

Oracle 将一列转换为两列,oracle,Oracle,我想我可以做得比我想出的解决方案简单。因此,我想问的是,是否有可能对以下问题有一个更简单的解决办法: 我有单栏格式的数据,如下所示: COLUMN 1 ========= partnumber version partnumber version partnumber version etc 每个项目由零件号和版本标识。项目的版本紧跟在项目的零件号之后。但是,我希望数据采用以下格式: COLUMN 1 COLUMN

我想我可以做得比我想出的解决方案简单。因此,我想问的是,是否有可能对以下问题有一个更简单的解决办法:

我有单栏格式的数据,如下所示:

    COLUMN 1
    =========
    partnumber
    version
    partnumber
    version
    partnumber
    version
    etc
每个项目由零件号和版本标识。项目的版本紧跟在项目的零件号之后。但是,我希望数据采用以下格式:

COLUMN 1    COLUMN 2
========== =========
partnumber version
partnumber version
partnumber version
etc        etc
我提出了以下两个备选问题:

with data as (
select col,rownum+mod(rownum,2) item_index,row_number() over (partition by rownum+mod(rownum,2) order by rownum ) colno from(
select -2141 col from dual
union all 
select 5 col from dual
union all
select -2102 col from dual
union all
select 2 col from dual
union all
select -2021 col from dual
union all
select 4 col from dual))
select t1.col,t2.col from (select col,item_index from data where colno=1) t1
join (select col,item_index from data where colno=2) t2
on t1.item_index=t2.item_index;


with data as (
select col,rownum rn from (
select -2141 col from dual
union all 
select 5 col from dual
union all
select -2102 col from dual
union all
select 2 col from dual
union all
select -2021 col from dual
union all
select 4 col from dual))
select t1.col,t2.col from (select col,rn+mod(rn,2) item_index from data where mod(rn,2)=1) t1
join (select col,rn+mod(rn,2) item_index from data where mod(rn,2)=0) t2
on t1.item_index=t2.item_index;

有更好的选择吗?

对我来说,这看起来有点简单:

WITH data(value) AS (
  SELECT 'partnumber' FROM dual UNION ALL
  SELECT 'version'    FROM dual UNION ALL
  SELECT 'partnumber' FROM dual UNION ALL
  SELECT 'version'    FROM dual UNION ALL
  SELECT 'partnumber' FROM dual UNION ALL
  SELECT 'version'    FROM dual UNION ALL
  SELECT 'etc'        FROM dual UNION ALL
  SELECT 'etc'        FROM dual),
seq_data(seq, value) AS (
  SELECT ROWNUM, value FROM data
)
SELECT
  t1.value column1, t2.value column2
FROM
  seq_data t1
  JOIN seq_data t2 ON t1.seq = t2.seq - 1
WHERE
  mod(t1.seq, 2) = 1

对我来说,这看起来有点简单:

WITH data(value) AS (
  SELECT 'partnumber' FROM dual UNION ALL
  SELECT 'version'    FROM dual UNION ALL
  SELECT 'partnumber' FROM dual UNION ALL
  SELECT 'version'    FROM dual UNION ALL
  SELECT 'partnumber' FROM dual UNION ALL
  SELECT 'version'    FROM dual UNION ALL
  SELECT 'etc'        FROM dual UNION ALL
  SELECT 'etc'        FROM dual),
seq_data(seq, value) AS (
  SELECT ROWNUM, value FROM data
)
SELECT
  t1.value column1, t2.value column2
FROM
  seq_data t1
  JOIN seq_data t2 ON t1.seq = t2.seq - 1
WHERE
  mod(t1.seq, 2) = 1

Oracle安装程序

CREATE TABLE data(value) AS
  SELECT 'partnumber' FROM dual UNION ALL
  SELECT 'version'    FROM dual UNION ALL
  SELECT 'partnumber' FROM dual UNION ALL
  SELECT 'version'    FROM dual UNION ALL
  SELECT 'partnumber' FROM dual UNION ALL
  SELECT 'version'    FROM dual UNION ALL
  SELECT 'etc'        FROM dual UNION ALL
  SELECT 'etc'        FROM dual;
SELECT *
FROM   (
  SELECT value,
         CEIL( ROWNUM / 2 ) AS id,
         MOD( ROWNUM, 2 ) AS isPartNo
  FROM   DATA
)
PIVOT( MAX( value ) FOR isPartNo IN ( 1 AS PartNumber, 0 AS Version ) )
ORDER BY id;
        ID PARTNUMBER VERSION  
---------- ---------- ----------
         1 partnumber version    
         2 partnumber version    
         3 partnumber version    
         4 etc        etc        
查询

CREATE TABLE data(value) AS
  SELECT 'partnumber' FROM dual UNION ALL
  SELECT 'version'    FROM dual UNION ALL
  SELECT 'partnumber' FROM dual UNION ALL
  SELECT 'version'    FROM dual UNION ALL
  SELECT 'partnumber' FROM dual UNION ALL
  SELECT 'version'    FROM dual UNION ALL
  SELECT 'etc'        FROM dual UNION ALL
  SELECT 'etc'        FROM dual;
SELECT *
FROM   (
  SELECT value,
         CEIL( ROWNUM / 2 ) AS id,
         MOD( ROWNUM, 2 ) AS isPartNo
  FROM   DATA
)
PIVOT( MAX( value ) FOR isPartNo IN ( 1 AS PartNumber, 0 AS Version ) )
ORDER BY id;
        ID PARTNUMBER VERSION  
---------- ---------- ----------
         1 partnumber version    
         2 partnumber version    
         3 partnumber version    
         4 etc        etc        
输出

CREATE TABLE data(value) AS
  SELECT 'partnumber' FROM dual UNION ALL
  SELECT 'version'    FROM dual UNION ALL
  SELECT 'partnumber' FROM dual UNION ALL
  SELECT 'version'    FROM dual UNION ALL
  SELECT 'partnumber' FROM dual UNION ALL
  SELECT 'version'    FROM dual UNION ALL
  SELECT 'etc'        FROM dual UNION ALL
  SELECT 'etc'        FROM dual;
SELECT *
FROM   (
  SELECT value,
         CEIL( ROWNUM / 2 ) AS id,
         MOD( ROWNUM, 2 ) AS isPartNo
  FROM   DATA
)
PIVOT( MAX( value ) FOR isPartNo IN ( 1 AS PartNumber, 0 AS Version ) )
ORDER BY id;
        ID PARTNUMBER VERSION  
---------- ---------- ----------
         1 partnumber version    
         2 partnumber version    
         3 partnumber version    
         4 etc        etc        

Oracle安装程序

CREATE TABLE data(value) AS
  SELECT 'partnumber' FROM dual UNION ALL
  SELECT 'version'    FROM dual UNION ALL
  SELECT 'partnumber' FROM dual UNION ALL
  SELECT 'version'    FROM dual UNION ALL
  SELECT 'partnumber' FROM dual UNION ALL
  SELECT 'version'    FROM dual UNION ALL
  SELECT 'etc'        FROM dual UNION ALL
  SELECT 'etc'        FROM dual;
SELECT *
FROM   (
  SELECT value,
         CEIL( ROWNUM / 2 ) AS id,
         MOD( ROWNUM, 2 ) AS isPartNo
  FROM   DATA
)
PIVOT( MAX( value ) FOR isPartNo IN ( 1 AS PartNumber, 0 AS Version ) )
ORDER BY id;
        ID PARTNUMBER VERSION  
---------- ---------- ----------
         1 partnumber version    
         2 partnumber version    
         3 partnumber version    
         4 etc        etc        
查询

CREATE TABLE data(value) AS
  SELECT 'partnumber' FROM dual UNION ALL
  SELECT 'version'    FROM dual UNION ALL
  SELECT 'partnumber' FROM dual UNION ALL
  SELECT 'version'    FROM dual UNION ALL
  SELECT 'partnumber' FROM dual UNION ALL
  SELECT 'version'    FROM dual UNION ALL
  SELECT 'etc'        FROM dual UNION ALL
  SELECT 'etc'        FROM dual;
SELECT *
FROM   (
  SELECT value,
         CEIL( ROWNUM / 2 ) AS id,
         MOD( ROWNUM, 2 ) AS isPartNo
  FROM   DATA
)
PIVOT( MAX( value ) FOR isPartNo IN ( 1 AS PartNumber, 0 AS Version ) )
ORDER BY id;
        ID PARTNUMBER VERSION  
---------- ---------- ----------
         1 partnumber version    
         2 partnumber version    
         3 partnumber version    
         4 etc        etc        
输出

CREATE TABLE data(value) AS
  SELECT 'partnumber' FROM dual UNION ALL
  SELECT 'version'    FROM dual UNION ALL
  SELECT 'partnumber' FROM dual UNION ALL
  SELECT 'version'    FROM dual UNION ALL
  SELECT 'partnumber' FROM dual UNION ALL
  SELECT 'version'    FROM dual UNION ALL
  SELECT 'etc'        FROM dual UNION ALL
  SELECT 'etc'        FROM dual;
SELECT *
FROM   (
  SELECT value,
         CEIL( ROWNUM / 2 ) AS id,
         MOD( ROWNUM, 2 ) AS isPartNo
  FROM   DATA
)
PIVOT( MAX( value ) FOR isPartNo IN ( 1 AS PartNumber, 0 AS Version ) )
ORDER BY id;
        ID PARTNUMBER VERSION  
---------- ---------- ----------
         1 partnumber version    
         2 partnumber version    
         3 partnumber version    
         4 etc        etc        

你如何定义“立即跟进”?您是否依赖于行在数据库中的物理存储顺序?无论出于何种原因,当这种情况发生变化时,您会怎么做?@mathguy值存储在VARRAY中。您如何定义“立即跟随”?您是否依赖于行在数据库中的物理存储顺序?无论出于何种原因,当这种情况发生变化时,您会怎么做?@mathguy值存储在VARRAY中。非常好的解决方案,只有一个表访问。非常好的解决方案,只有一个表访问。