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中。非常好的解决方案,只有一个表访问。非常好的解决方案,只有一个表访问。