【问题标题】:Split Column Characters to rows Oracle将列字符拆分为行 Oracle
【发布时间】:2014-03-12 12:37:42
【问题描述】:

我到处寻找这个功能,我几乎要放弃它了。我有一个如下所示的 Oracle 表:

name      Number_of_Leaves    status
cheque1        5              PPURI
cheque4        10             UUSPDRIPPP

状态列显示每个检查叶的状态,包括通过、已停止、已销毁、已发出等。 我需要在这样的视图中表示信息:对于每个检查状态,我应该有一个单行:

name      Number_of_Leaves    status
    cheque1        5              P
    cheque1        5              P
    cheque1        5              U
    cheque1        5              R
    cheque1        5              I
    cheque4        10             U
    cheque4        10             U
    cheque4        10             S
    cheque4        10             P
    cheque4        10             D
    ...............................

这是否可以通过任何方式实现??

【问题讨论】:

  • 请举个例子..
  • 什么样的例子?我上面已经举过例子了??
  • +1) 谢谢你的好问题。

标签: sql oracle split


【解决方案1】:

只需自己添加这个函数;)例如,使用 TABLE 运算符和预定义的拆分函数:

CREATE OR REPLACE TYPE t_char IS TABLE OF VARCHAR2(1)

/

CREATE OR REPLACE FUNCTION TMP_SPLIT(p_val VARCHAR2)
RETURN t_char IS
v_res t_char;
BEGIN
v_res := t_char(SUBSTR(p_val,1,1));
v_res.extend(LENGTH(p_val)-1);
FOR i IN 2..LENGTH(p_val) LOOP
    v_res(i) := SUBSTR(p_val,i,1);
END LOOP;
RETURN v_res;
END;

/

WITH dat AS (SELECT 'cheque1' name,
                    5 Number_of_Leaves,
                    'PPURI' status FROM DUAL
             UNION 
             SELECT 'cheque4' name,
                    10 Number_of_Leaves,
                    'UUSPDRIPPP' status FROM DUAL)
SELECT dat.name, dat.number_of_leaves, spl.*
FROM dat 
     LEFT JOIN TABLE(TMP_SPLIT(dat.status)) spl ON 1=1

/

现有表调用函数示例:

SELECT table1.name, table1.number_of_leaves, spl.*
FROM table1
     LEFT JOIN TABLE(TMP_SPLIT(table1.status)) spl ON 1=1

【讨论】:

  • 状态会改变这只是一个例子。如果我有 50 个叶子,我将有 50 个状态。
  • @Stanley 所以?该功能将工作相同,我不明白是什么问题。
  • 所以我将不得不手动传递这样的一千条记录的值??请参阅我担心的是这不是动态的,因为值UUSPDRIPPPPPURI 是硬编码的。
  • @Stanley 当然不是 :) 这只是一个例子,所以我不必在我的测试模式中创建表。您可以将其应用于现有表 - 检查更新的答案。
  • 哦,我现在明白了,我不需要以WITH dat as... 开头的部分来获取现有表对吗???
【解决方案2】:

是的,我的朋友有可能:

with tab1(rn,name,status,Number_of_Leaves,tes) as 
(select 1 rn,name,status,Number_of_Leaves,substr(status,1,1) tes from table1
union all 
select rn + 1 rn,name,status,Number_of_Leaves,substr(status,rn + 1,1) tes from tab1
where rn < Number_of_Leaves),
tab2 as (select status,rn,name,Number_of_Leaves,Tes from 
tab1 order by status,rn)
select name,Number_of_Leaves,Tes status from tab2;

SQL Fiddle

【讨论】:

  • 你的似乎是我正在寻找的东西从小提琴来看,但我真的很想理解 sql。我是绿色的:)
  • 我在 Oracle 11g 上 ORA-32033: unsupported column aliasingam
猜你喜欢
  • 2016-08-19
  • 1970-01-01
  • 2014-12-12
  • 2016-04-18
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
相关资源
最近更新 更多