问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

oracle行转列 列转行求助

发布网友 发布时间:2022-04-22 20:42

我来回答

2个回答

热心网友 时间:2022-04-08 02:24


Oracle 需要首先在数据库中, 创建好 类型 与 函数。
来实现一个  split 功能的处理。



-- 定义一个对象类型.
CREATE OR REPLACE TYPE ty_row_str_split as object (strValue VARCHAR2 (4000));
/

-- 定义一个 表/数组类型, 内容是前面定义的那个对象.
CREATE OR REPLACE TYPE ty_tbl_str_split IS TABLE OF ty_row_str_split;
/

--------------------
-- 字符分割函数.
-- 参数1:  被分割的源字符串
-- 参数2:  用于拆分的字符串。
--------------------
CREATE OR REPLACE FUNCTION fn_split(
  p_str       IN VARCHAR2,
  p_delimiter IN VARCHAR2)
RETURN ty_tbl_str_split IS
  j         INT := 0;
  i         INT := 1;
  -- 被分割的源字符串 的长度.
  len       INT := 0;
  -- 分隔字符串的长度
  len1      INT := 0;
  -- 暂存的中间每一个单元的文本信息.
  str       VARCHAR2(4000);
  -- 预期返回结果.
  str_split ty_tbl_str_split := ty_tbl_str_split();
BEGIN
  -- 被分割的源字符串 的长度.
  len   := LENGTH(p_str);
  -- 分隔字符串的长度.
  len1 := LENGTH(p_delimiter);

  -- 遍历 被分割的源字符串.
  WHILE j < len LOOP
    -- 在被分割的源字符串中, 查询 分隔字符串.
    j := INSTR(p_str, p_delimiter, i);

    IF j = 0 THEN
      -- j=0 意味着没有找到. 
  -- 可以理解为是查询到最后一个单元了.
  -- 设置 j := len, 让外部的循环处理可以结束了.
      j  := len;
      -- 获取最后一个单元的内容.
      str := SUBSTR(p_str, i);
      -- 结果追加一行.
      str_split.EXTEND;
      -- 设置结果内容.
      str_split(str_split.COUNT) := ty_row_str_split(strValue => str);
    
      IF i >= len THEN
        EXIT;
      END IF;
    ELSE
      -- 如果在被分割的源字符串中,找到了 分隔字符串.
      -- 首先,获取分割的内容.
      str := SUBSTR(p_str, i, j - i);
      -- 然后设置索引, 下一次再查找的时候,从指定的索引位置开始(不是从0开始找了)
      i := j + len1;
      -- 结果追加一行.
      str_split.EXTEND;
      -- 设置结果内容.  
      str_split(str_split.COUNT) := ty_row_str_split(strValue => str);
    END IF;
  END LOOP;


  RETURN str_split;
END fn_split;
/




函数创建完毕以后,可以开始做查询的处理.


CREATE TABLE a (
  id   int,
  val  varchar2(10)
);


insert into a values(1,    'B1||B2||B3');
insert into a values(2,    'B4||B5');
insert into a values(3,    'B6');

COLUMN "Value" FORMAT A15


SQL> select 
  2    a.id,
  3    to_char(strvalue) as Value 
  4  from 
  5    a,
  6    table(fn_split( a.val,  '||'));

        ID VALUE
---------- ---------------
         1 B1
         1 B2
         1 B3
         2 B4
         2 B5
         3 B6

已选择6行。

追问用正则表达式能写吗

追答正则 你要

1 B1||B2||B3

一行变三行啊

你有什么 WHERE 条件, 可以一行 拆三行的?

热心网友 时间:2022-04-08 03:42

select id, substr( names, instr('||'|| names, '||', 1, rn),
instr( names||'||', '||', 1, rn) - instr('||'|| names, '||', 1, rn) ) name
from A,(select rownum rn from al connect by rownum < 10)
where instr('||'|| names, '||', 1, rn) > 0
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
饥荒巨鸟图腾有什么用 饥荒巨鸟图腾怎么激活 恐惧饥荒健康怎么回复 健康值系统详解 想在京东买32g内存卡,发个商品号给我吧 民族文化浅谈普米族的宗教信仰 iphone4s进入恢复模式后,过几十秒就自动关机 hdr10是什么意思(hdr10是什么) 郑州禧年化妆摄影学校的专业设置 乔迁择吉2022年属鸡4月最佳入新居日子? 变电站中110kv配电变压器最小多大容量? oracle行列转换问题 ORAClE sql如何实现行转列? Oracle列转行,行转列 oracle行列转换 oracle 行和列转换 oracle 行列转换 oracle 行转换为列 ORACLE行转列问题 如何在oracle中进行列行转换 小米怎么双开 我有对方的但是没他的手机请问怎么能看到微信的聊天记录..._百度问一问 怎么查看自己加入的所有群聊 qq怎么查看以前加过的群? 急求解,农业银行转账转错账号转给了不认识的人怎么办?钱能要回来吗? 在银行汇款汇错了帐号有办法能追回来不 我昨天对公转账转错了,可以把钱追回来吗? 支付宝转账转错了账号钱可以追回吗? 银行转账,钱转错账户了还能拿回来么 银行卡转账转错了钱还能退回来吗 手机银行转账转错了账号钱还能追回来吗? oracle 行转列 ,这个要怎么转 Oracle 数据库行转列 oracle 行转列 oracle查询行转列怎么写 Oracle数据库行列转换 oracle如何实现行转列 oracle数据列转成行 oracle多行转多列 用开水烫面能做什么?有什么作用? 发面和烫面,用途都有哪些不同? 烫面适合做什么面点? 发面和烫面,用途有哪些不同? 烫面可以发酵吗? 半烫面,发面,烫面和死面,用途有什么不同呢? 烫面、发面、死面的区别是什么?用途又有什么不同? 烫面发面混合使用做油酥饼行吗? 一半烫面一半发面怎么炸油饼 面粉烫了一半另一半用凉水和面,其中还放了发酵粉,能做什么面食? 发面和烫面做出来的葱花饼,哪种做法会更好吃? 烫面加发面能烙饼吗