oracle 小写函数10G 没有 PIVOT 函数怎么办,自己写一个不久有了

pivot吧-百度贴吧--欢迎来到Pivot吧!--Welcome to the pivot family.欢迎来到Pivot吧,这里有各种各样的素材还有火柴人的动画。
签到排名:今日本吧第个签到,
本吧因你更精彩,明天继续来努力!
本吧排名:
本吧签到人数:63
可签7级以上的吧50个
本月漏签0次!
成为超级会员,赠送8张补签卡
连续签到:天&&累计签到:天
超级会员单次开通12个月以上,赠送连续签到卡3张
欢迎来到Pivot吧!
难道要一个一个拼起来
大家可以叫我惑七。我了解这个圈子没有多久,大概上个星期才接触……大佬们求罩…… 在B站上看到了教
第一人称练习: b站地址:/video/av5517965/index_3.html
大家好我是minimaker工作室的灵魂石,忘了什么时候加入这个吧了,但总是没有发练习,所以我打算开个新
练pivot难吗
大家好啊这里是新入坑的莫白~然后为了监督自己, 开了个练习贴~欢迎大佬指出不足~
boss:心态崩了
诸位,我是小乐,我开个漫画贴好不好,有没有人设要报名
我时不时会发我以前的渣渣,我现在不想在看见flash了贴吧的gif加速功能也是醉了
不说话看图
如题 闲暇时做的
以后练习都发这
这个本是签名档,可我搞失败了,变成了练习
先开个头彩:SL vs 千
玩了一个中午感觉太好玩了,求老司机带带我 !
随便开的帖子
这次不会在重开一个练习贴了,无论我多久更新练习贴,我都会在这发了,不会在重开贴了。
貌似拿手机发的贴电脑贴吧打不开,于是拿电脑再发一个:
hi各位,这里是寒假入坑的萌新大绅士。以后我的人设的动画就发在这里面好了。 先来三张人设图
o佬的练习帖里,思想呆萌者因为o佬的装新而喜欢和o佬开玩笑,越开越过分。过了度。虽然你思想呆萌者
我是阿粗 吧里帖子太多太乱了 我干脆开个动画互动贴 大家把日常作品都贴这里吧 小练习就不要单独开贴
大家可以报名把人设贴出来
就叫G绿吧,原谅色的。男17岁,武器是一次战斗中缴获的敌人手臂,必要时可以放一个超级金坷垃,第一
温馨提示:本漫画由棺木小智障提供,画的不好请见谅,准备工作就绪请大家广发人设,好让我订剧情活
虽然我不是大神,不过,如果对你有用的话,我就教教看吧。
我加入神鹰群也算有一点点时间了,却没有几个成功做完的入群RHG,所以,在此请求单单(扇)同意加入
之前不知道干嘛,发不了Gif……
不管是新手还是大佬,这里都欢迎大家讨论动画 群号:
嘉文我错了啊啊啊 不要禁言我嘛~我保证以后再也不干这种缺大德的事了 我...我...我给您洗脚
嗯因为平时比较忙,很多人问的问题没时间一一解答所以悄摸开个贴。。。 主上色吧。。。人物上色水啊
hihi,我是被拉入坑的子凌,以后我人设的动画都会发在这里=W=
新人渣作一张 瞎玩的
谁来评论一下
专业解决婚姻纠纷,绿帽子纠纷,出轨纠纷等各类情感问题!
你可能感兴趣的吧...
发贴红色标题
签到六倍经验
兑换本吧会员
赠送补签卡1张,获得
助攻总额: 43W
贴吧热议榜
发表后自动分享本贴
使用签名档&众所周知,静态SQL的输出结构必须也是静态的。对于经典的行转列问题,如果行数不定导致输出的列数不定,标准的答案就是使用动态SQL, 到11G里面则有XML结果的PIVOT。 但是 oracle 10G 没有 PIVOT 函数怎么办,自己写一个不久有了。上代码 直接点。 CREATE OR REPLA
面向对象(多态的概述及其代码体现) 面向对象(多态中的成员访问特点之成员变量) 面向对象(多态中的成员访问特点之成员方法) 面向对象(多态中的成员访问特点之静态成员方法) 面向对象(超人的故事) 面向对象(多态中向上转型和向下转型) 面向对象(多态的好处和弊端) 面向对象(多态中的题目分析题) 面向
前面介绍了XML的作用和基本的格式,今天我给大家分享的是关于XML的约束。废话不多说,我们直接来正题! 一、DTD简介 1.1、DTD概述 DTD(Document Type Definition,文档类型定义) 1)DTD是一套关于标记符的语法规则。它是XML1.0版规格的一部分,是XML文件的验
图像灰度级数我们见得最多的就是256了,如果想调整它的灰度级数,我们可以使用图像库的imadjust函数来作出调整,比如讲256个灰度级变成2个灰度级(也就是二值图了)。再举一个例子,原来一幅256个灰度级的图像,如果我们把它的灰度级重新调整为4,那么调整后这幅图像的灰度值应该就是有4个值:0,85
vue 2 使用Bus.js进行兄弟(非父子)组件通信 简单案例
讲一个故事 魔兽世界还是很好玩的,经典的游戏。。。为了联盟!!!魔兽世界多人配合的游戏,分为各种职业,互相配合,在进行统计数据的时候,会根据你的数据来查看你对团队做出的贡献。 每天都在玩,每天都在看各种数据和手法,每次也能看到数据排名靠前,但是,突然有一天,有人说,你在那里刷假数据,靠刷的,
在游戏中展现一个写实的田园场景时,草地的渲染是必不可少的,而目前的游戏基本使用的还是星形的面片草,本文就来换一个思路,在gpu上创建更真实草叶。
动机 现在大家都知道单元测试对我们代码的好处。并且我们都承认它是开发过程中不可或缺的一部分。但是在把代码切换到数据库的模式下的时候,我们被粗暴地打回了软件测试的黑暗年代...我们现在面临着逻辑下推到ABAP CDS entities后,代码要如何测试的难题。 CDS Test Double Fram
起因: 同事让我看 搜公司名称,百度第一位并没有出现公司网址,是别人的,然后我 惊奇的发现,站点logo 竟然 抓了张 无关紧要的图片,从此 变开始了 为期 10天+的战争; 经过: 【】 1)把 logo的尺寸 变成 121:75 的比例吗? 2)权重 为0 的情况下,我 需要
1. swiper隐藏之后,再显示,滑动不流畅,且无限滑动会失败; 解决方法: 添加一下两个属性 observer: true,//修改swiper自己或子元素时,自动初始化swiper observeParents: true,//修改swiper的父元素时,自动初始化swiper 2.动态生成的
本系统能实行基本的图书信息管理和借阅功能 下面是设计报告,代码在后边: xxxxx大学 C语言课程设计报告 题 目 图书管理系统设计 专业班级 xxxx级计算机科学与技术本科x班 组 别 计科第xx组 学生姓名 小哥哥 院 (系) 信息工程系 指导教师(职称) xxx(教授) 完成时间 xxxx年x
这组吉祥物的设计来源于“奥克斯”品牌的英文“AUX”,根据字母的形态结构赋予每个形象以不同造型与涵义。
What's the language that the most Americans speak after English? As you'd probably guess, the second-most common language spoken in the U.S. is Spanish. But if you look at the most common languages after English and Spanish, the results get a little more surprising,
说到电影、连续剧、音乐等媒体消费,大家多数会先想到 iTunes 和 Google Play 这两大数码商店。不过,Twitter 用户 @SteamDB 最近在 Steam...
In this podcast we welcome Dan Raywood, Editor of the IT Security Guru to talk with Paul Cooper and Wayne Scott about the latest Shellshock securty scare, dubbed "worse than Heartbleed."Read more: http://www.itproportal.
前段时间翻看了《X创新》的中译版,并应邀写了推荐序,分享一下,也一并推荐此书。 X创新 我相信,会看到这篇文章的同学都有体会,身边的新产品越来越多,创业的朋友也越来越多。
v3rgEz writes with this story of a top secret Cold War plan which would have brought the U.S. under martial law. Starting on April 19, 1956, the federal government practiced and planned for a near-doomsday scenario known as Plan C. When activated,
现在,移动应用几乎无处不在,我们无法忽视它作为提供服务的辅助甚至是主要渠道的价值。
感谢shawn的投递跨平台游戏开发引擎Unity的研发商Unity Technologies公司在官方博客文章中宣布,将于几天后的GDC大会上公布重大消息(some big news)。极有可能是其最新版Unity5的正式发布。
最近发了份电影的评论,发表了一些浅见,今天特地整理了一下文中电影数据的来源,给缺乏动手能力的童鞋参考参考。《“大数据”评评2015年国产电影》文运用到年豆瓣共47000部电影数据。oracle&行转列&列转行
最近论坛很多人提的问题都与行列转换有关系,所以我对行列转换的相关知识做了一个总结,希望对大家有所帮助,同时有何错疏,恳请大家指出,我也是在写作过程中学习,算是一起和大家学习吧!
行列转换包括以下六种情况:
3)多列转换成字符串
4)多行转换成字符串
5)字符串转换成多列
6)字符串转换成多行
下面分别进行举例介绍。
首先声明一点,有些例子需要如下10g及以后才有的知识:
A.掌握model子句
B.正则表达式
C.加强的层次查询
讨论的适用范围只包括8i,9i,10g及以后版本。
CREATE TABLE t_col_row(
c1 VARCHAR2(10),
c2 VARCHAR2(10),
c3 VARCHAR2(10));
INSERT INTO t_col_row VALUES (1, 'v11', 'v21', 'v31');
INSERT INTO t_col_row VALUES (2, 'v12', 'v22', NULL);
INSERT INTO t_col_row VALUES (3, 'v13', NULL, 'v33');
INSERT INTO t_col_row VALUES (4, NULL, 'v24', 'v34');
INSERT INTO t_col_row VALUES (5, 'v15', NULL, NULL);
INSERT INTO t_col_row VALUES (6, NULL, NULL, 'v35');
INSERT INTO t_col_row VALUES (7, NULL, NULL, NULL);
SELECT * FROM t_col_
适用范围:8i,9i,10g及以后版本
SELECT id, 'c1' cn, c1 cv
FROM t_col_row
SELECT id, 'c2' cn, c2 cv
FROM t_col_row
SELECT id, 'c3' cn, c3 cv FROM t_col_
若空行不需要转换,只需加一个where条件,
WHERE COLUMN IS NOT NULL 即可。
适用范围:10g及以后
SELECT id, cn, cv FROM t_col_row
RETURN UPDATED ROWS
PARTITION BY (ID)
DIMENSION BY (0 AS n)
MEASURES ('xx' AS cn,'yyy' AS cv,c1,c2,c3)
RULES UPSERT ALL
cn[1] = 'c1',
cn[2] = 'c2',
cn[3] = 'c3',
cv[1] = c1[0],
cv[2] = c2[0],
cv[3] = c3[0]
ORDER BY ID,
2.3COLLECTION
适用范围:8i,9i,10g及以后版本
要创建一个对象和一个集合:
CREATE TYPE cv_pair AS OBJECT(cn VARCHAR2(10),cv
VARCHAR2(10));
CREATE TYPE cv_varr AS VARRAY(8) OF cv_
SELECT id, t.cn AS cn, t.cv AS cv
FROM t_col_row,
TABLE(cv_varr(cv_pair('c1', t_col_row.c1),
cv_pair('c2', t_col_row.c2),
cv_pair('c3', t_col_row.c3))) t
ORDER BY 1, 2;
CREATE TABLE t_row_col AS
SELECT id, 'c1' cn, c1 cv
FROM t_col_row
SELECT id, 'c2' cn, c2 cv
FROM t_col_row
SELECT id, 'c3' cn, c3 cv FROM t_col_
SELECT * FROM t_row_col ORDER BY 1,2;
3.1AGGREGATE FUNCTION
适用范围:8i,9i,10g及以后版本
SELECT id,
MAX(decode(cn, 'c1', cv, NULL)) AS c1,
MAX(decode(cn, 'c2', cv, NULL)) AS c2,
MAX(decode(cn, 'c3', cv, NULL)) AS c3
FROM t_row_col
GROUP BY id
ORDER BY 1;
MAX聚集函数也可以用sum、min、avg等其他聚集函数替代。
被指定的转置列只能有一列,但固定的列可以有多列,请看下面的例子:
SELECT mgr, deptno, empno, ename FROM emp ORDER BY 1, 2;
SELECT mgr,
MAX(decode(empno, '7788', ename, NULL)) "7788",
MAX(decode(empno, '7902', ename, NULL)) "7902",
MAX(decode(empno, '7844', ename, NULL)) "7844",
MAX(decode(empno, '7521', ename, NULL)) "7521",
MAX(decode(empno, '7900', ename, NULL)) "7900",
MAX(decode(empno, '7499', ename, NULL)) "7499",
MAX(decode(empno, '7654', ename, NULL)) "7654"
WHERE mgr IN ()
AND deptno IN (20, 30)
GROUP BY mgr, deptno
ORDER BY 1, 2;
这里转置列为empno,固定列为mgr,deptno。
还有一种行转列的方式,就是相同组中的行值变为单个列值,但转置的行值不变为列名:
ID CN_1 CV_1 CN_2 CV_2 CN_3 CV_3
1 c1 v11 c2 v21 c3 v31
2 c1 v12 c2 v22 c3
3 c1 v13 c2 c3 v33
4 c1 c2 v24 c3 v34
5 c1 v15 c2 c3
6 c1 c2 c3 v35
7 c1 c2 c3
这种情况可以用分析函数实现:
SELECT id,
MAX(decode(rn, 1, cn, NULL)) cn_1,
MAX(decode(rn, 1, cv, NULL)) cv_1,
MAX(decode(rn, 2, cn, NULL)) cn_2,
MAX(decode(rn, 2, cv, NULL)) cv_2,
MAX(decode(rn, 3, cn, NULL)) cn_3,
MAX(decode(rn, 3, cv, NULL)) cv_3
FROM (SELECT id,
row_number() over(PARTITION BY id ORDER BY cn, cv) rn
FROM t_row_col)
GROUP BY ID;
适用范围:8i,9i,10g及以后版本
这种对于行值不固定的情况可以使用。
下面是我写的一个包,包中
p_rows_column_real用于前述的第一种不限定列的转换;
p_rows_column用于前述的第二种不限定列的转换。
CREATE OR REPLACE PACKAGE pkg_dynamic_rows_column AS
TYPE refc IS REF CURSOR;
PROCEDURE p_print_sql(p_txt VARCHAR2);
FUNCTION f_split_str(p_str VARCHAR2, p_division VARCHAR2, p_seq
RETURN VARCHAR2;
PROCEDURE p_rows_column(p_table IN VARCHAR2,
p_keep_cols IN VARCHAR2,
p_pivot_cols IN VARCHAR2,
p_where IN VARCHAR2 DEFAULT NULL,
p_refc IN OUT refc);
PROCEDURE p_rows_column_real(p_table IN VARCHAR2,
p_keep_cols IN VARCHAR2,
p_pivot_col IN VARCHAR2,
p_pivot_val IN VARCHAR2,
p_where IN VARCHAR2 DEFAULT NULL,
p_refc IN OUT refc);
CREATE OR REPLACE PACKAGE BODY pkg_dynamic_rows_column AS
PROCEDURE p_print_sql(p_txt VARCHAR2) IS
v_len INT;
v_len := length(p_txt);
FOR i IN 1 .. v_len / 250 + 1 LOOP
dbms_output.put_line(substrb(p_txt, (i - 1) * 250 + 1, 250));
FUNCTION f_split_str(p_str VARCHAR2, p_division VARCHAR2, p_seq
RETURN VARCHAR2 IS
v_first INT;
v_last INT;
IF p_seq & 1 THEN
RETURN NULL;
IF p_seq = 1 THEN
IF instr(p_str, p_division, 1, p_seq) = 0 THEN
RETURN substr(p_str, 1, instr(p_str, p_division, 1) - 1);
v_first := instr(p_str, p_division, 1, p_seq - 1);
v_last := instr(p_str, p_division, 1, p_seq);
IF (v_last = 0) THEN
IF (v_first & 0) THEN
RETURN substr(p_str, v_first + 1);
RETURN NULL;
RETURN substr(p_str, v_first + 1, v_last - v_first - 1);
END f_split_
PROCEDURE p_rows_column(p_table IN VARCHAR2,
p_keep_cols IN VARCHAR2,
p_pivot_cols IN VARCHAR2,
p_where IN VARCHAR2 DEFAULT NULL,
p_refc IN OUT refc) IS
v_sql VARCHAR2(4000);
TYPE v_keep_ind_by IS TABLE OF VARCHAR2(4000) INDEX BY
BINARY_INTEGER;
v_keep v_keep_ind_
TYPE v_pivot_ind_by IS TABLE OF VARCHAR2(4000) INDEX BY
BINARY_INTEGER;
v_pivot v_pivot_ind_
v_keep_cnt INT;
v_pivot_cnt INT;
v_max_cols INT;
v_partition VARCHAR2(4000);
v_partition1 VARCHAR2(4000);
v_partition2 VARCHAR2(4000);
v_keep_cnt := length(p_keep_cols) - length(REPLACE(p_keep_cols,
',')) + 1;
v_pivot_cnt := length(p_pivot_cols) -
length(REPLACE(p_pivot_cols, ',')) + 1;
FOR i IN 1 .. v_keep_cnt LOOP
v_keep(i) := f_split_str(p_keep_cols, ',', i);
FOR j IN 1 .. v_pivot_cnt LOOP
v_pivot(j) := f_split_str(p_pivot_cols, ',', j);
v_sql := 'select max(count(*)) from ' || p_table || ' group by
FOR i IN 1 .. v_keep.LAST LOOP
v_sql := v_sql || v_keep(i) || ',';
v_sql := rtrim(v_sql, ',');
EXECUTE IMMEDIATE v_sql
INTO v_max_
v_partition := 'select ';
FOR x IN 1 .. v_keep.COUNT LOOP
v_partition1 := v_partition1 || v_keep(x) || ',';
FOR y IN 1 .. v_pivot.COUNT LOOP
v_partition2 := v_partition2 || v_pivot(y) || ',';
v_partition1 := rtrim(v_partition1, ',');
v_partition2 := rtrim(v_partition2, ',');
v_partition := v_partition || v_partition1 || ',' || v_partition2
', row_number() over (partition by ' || v_partition1 ||
' order by ' || v_partition2 || ') rn from ' || p_
v_partition := rtrim(v_partition, ',');
v_sql := 'select ';
FOR i IN 1 .. v_keep.COUNT LOOP
v_sql := v_sql || v_keep(i) || ',';
FOR i IN 1 .. v_max_cols LOOP
FOR j IN 1 .. v_pivot.COUNT LOOP
v_sql := v_sql || ' max(decode(rn,' || i || ',' || v_pivot(j)
',null))' || v_pivot(j) || '_' || i || ',';
IF p_where IS NOT NULL THEN
v_sql := rtrim(v_sql, ',') || ' from (' || v_partition || ' '
p_where || ') group by ';
v_sql := rtrim(v_sql, ',') || ' from (' || v_partition ||
') group by ';
FOR i IN 1 .. v_keep.COUNT LOOP
v_sql := v_sql || v_keep(i) || ',';
v_sql := rtrim(v_sql, ',');
p_print_sql(v_sql);
OPEN p_refc FOR v_
WHEN OTHERS THEN
OPEN p_refc FOR
SELECT 'x' FROM dual WHERE 0 = 1;
PROCEDURE p_rows_column_real(p_table IN VARCHAR2,
p_keep_cols IN VARCHAR2,
p_pivot_col IN VARCHAR2,
p_pivot_val IN VARCHAR2,
p_where IN VARCHAR2 DEFAULT NULL,
p_refc IN OUT refc) IS
v_sql VARCHAR2(4000);
TYPE v_keep_ind_by IS TABLE OF VARCHAR2(4000) INDEX BY
BINARY_INTEGER;
v_keep v_keep_ind_
TYPE v_pivot_ind_by IS TABLE OF VARCHAR2(4000) INDEX BY
BINARY_INTEGER;
v_pivot v_pivot_ind_
v_keep_cnt INT;
v_group_by VARCHAR2(2000);
v_keep_cnt := length(p_keep_cols) - length(REPLACE(p_keep_cols,
',')) + 1;
FOR i IN 1 .. v_keep_cnt LOOP
v_keep(i) := f_split_str(p_keep_cols, ',', i);
v_sql := 'select ' || 'cast(' || p_pivot_col ||
' as varchar2(200)) as ' || p_pivot_col || ' from ' || p_table
' group by ' || p_pivot_
EXECUTE IMMEDIATE v_sql BULK COLLECT
FOR i IN 1 .. v_keep.COUNT LOOP
v_group_by := v_group_by || v_keep(i) || ',';
v_group_by := rtrim(v_group_by, ',');
v_sql := 'select ' || v_group_by || ',';
FOR x IN 1 .. v_pivot.COUNT LOOP
v_sql := v_sql || ' max(decode(' || p_pivot_col || ',' || chr(39)
v_pivot(x) || chr(39) || ',' || p_pivot_val ||
',null)) as "' || v_pivot(x) || '",';
v_sql := rtrim(v_sql, ',');
IF p_where IS NOT NULL THEN
v_sql := v_sql || ' from ' || p_table || p_where || ' group by '
v_sql := v_sql || ' from ' || p_table || ' group by ' ||
p_print_sql(v_sql);
OPEN p_refc FOR v_
WHEN OTHERS THEN
OPEN p_refc FOR
SELECT 'x' FROM dual WHERE 0 = 1;
4.多列转换成字符串
CREATE TABLE t_col_str AS
SELECT * FROM t_col_
这个比较简单,用||或concat函数可以实现:
SELECT concat('a','b') FROM
4.1|| OR CONCAT
适用范围:8i,9i,10g及以后版本
SELECT * FROM t_col_
SELECT ID,c1||','||c2||','||c3 AS c123
FROM t_col_
5.多行转换成字符串
CREATE TABLE t_row_str(
col VARCHAR2(10));
INSERT INTO t_row_str VALUES(1,'a');
INSERT INTO t_row_str VALUES(1,'b');
INSERT INTO t_row_str VALUES(1,'c');
INSERT INTO t_row_str VALUES(2,'a');
INSERT INTO t_row_str VALUES(2,'d');
INSERT INTO t_row_str VALUES(2,'e');
INSERT INTO t_row_str VALUES(3,'c');
SELECT * FROM t_row_
5.1MAX + DECODE
适用范围:8i,9i,10g及以后版本
SELECT id,
MAX(decode(rn, 1, col, NULL)) ||
MAX(decode(rn, 2, ',' || col, NULL)) ||
MAX(decode(rn, 3, ',' || col, NULL)) str
FROM (SELECT id,
row_number() over(PARTITION BY id ORDER BY col) AS rn
FROM t_row_str) t
GROUP BY id
ORDER BY 1;
5.2ROW_NUMBER + LEAD
适用范围:8i,9i,10g及以后版本
SELECT id, str
FROM (SELECT id,
row_number() over(PARTITION BY id ORDER BY col) AS rn,
col || lead(',' || col, 1) over(PARTITION BY id ORDER BY col)
lead(',' || col, 2) over(PARTITION BY id ORDER BY col) ||
lead(',' || col, 3) over(PARTITION BY id ORDER BY col) AS str
FROM t_row_str)
WHERE rn = 1
ORDER BY 1;
适用范围:10g及以后版本
SELECT id, substr(str, 2) str FROM t_row_str
RETURN UPDATED ROWS
PARTITION BY(ID)
DIMENSION BY(row_number() over(PARTITION BY ID ORDER BY col) AS
MEASURES (CAST(col AS VARCHAR2(20)) AS str)
RULES UPSERT
ITERATE(3) UNTIL( presentv(str[iteration_number+2],1,0)=0)
(str[0] = str[0] || ',' || str[iteration_number+1])
ORDER BY 1;
5.4SYS_CONNECT_BY_PATH
适用范围:8i,9i,10g及以后版本
SELECT t.id id, MAX(substr(sys_connect_by_path(t.col, ','), 2))
FROM (SELECT id, col, row_number() over(PARTITION BY id ORDER BY
FROM t_row_str) t
START WITH rn = 1
CONNECT BY rn = PRIOR rn + 1
AND id = PRIOR id
GROUP BY t.
适用范围:10g及以后版本
SELECT t.id id, substr(sys_connect_by_path(t.col, ','), 2)
FROM (SELECT id, col, row_number() over(PARTITION BY id ORDER BY
FROM t_row_str) t
WHERE connect_by_isleaf = 1
START WITH rn = 1
CONNECT BY rn = PRIOR rn + 1
AND id = PRIOR
5.5WMSYS.WM_CONCAT
适用范围:10g及以后版本
这个函数预定义按','分隔字符串,若要用其他符号分隔可以用,replace将','替换。
SELECT id, REPLACE(wmsys.wm_concat(col), ',', '/') str
FROM t_row_str
6.字符串转换成多列
其实际上就是一个字符串拆分的问题。
CREATE TABLE t_str_col AS
SELECT ID,c1||','||c2||','||c3 AS c123
FROM t_col_
SELECT * FROM t_str_
6.1SUBSTR + INSTR
适用范围:8i,9i,10g及以后版本
SELECT id,
substr(c123, 1, instr(c123 || ',', ',', 1, 1) - 1) c1,
substr(c123,
instr(c123 || ',', ',', 1, 1) + 1,
instr(c123 || ',', ',', 1, 2) - instr(c123 || ',', ',', 1, 1) - 1)
substr(c123,
instr(c123 || ',', ',', 1, 2) + 1,
instr(c123 || ',', ',', 1, 3) - instr(c123 || ',', ',', 1, 2) - 1)
FROM t_str_col
ORDER BY 1;
6.2REGEXP_SUBSTR
适用范围:10g及以后版本
SELECT id,
rtrim(regexp_substr(c123 || ',', '.*?' || ',', 1, 1), ',') AS
rtrim(regexp_substr(c123 || ',', '.*?' || ',', 1, 2), ',') AS
rtrim(regexp_substr(c123 || ',', '.*?' || ',', 1, 3), ',') AS
FROM t_str_col
ORDER BY 1;
7.字符串转换成多行
CREATE TABLE t_str_row AS
SELECT id,
MAX(decode(rn, 1, col, NULL)) ||
MAX(decode(rn, 2, ',' || col, NULL)) ||
MAX(decode(rn, 3, ',' || col, NULL)) str
FROM (SELECT id,
row_number() over(PARTITION BY id ORDER BY col) AS rn
FROM t_row_str) t
GROUP BY id
ORDER BY 1;
SELECT * FROM t_str_
7.1UNION ALL
适用范围:8i,9i,10g及以后版本
SELECT id, 1 AS p, substr(str, 1, instr(str || ',', ',', 1, 1) - 1)
FROM t_str_row
SELECT id,
substr(str,
instr(str || ',', ',', 1, 1) + 1,
instr(str || ',', ',', 1, 2) - instr(str || ',', ',', 1, 1) - 1) AS
FROM t_str_row
SELECT id,
substr(str,
instr(str || ',', ',', 1, 1) + 1,
instr(str || ',', ',', 1, 2) - instr(str || ',', ',', 1, 1) - 1) AS
FROM t_str_row
ORDER BY 1, 2;
适用范围:10g及以后版本
SELECT id, 1 AS p, rtrim(regexp_substr(str||',', '.*?' || ',', 1,
1), ',') AS cv
FROM t_str_row
SELECT id, 2 AS p, rtrim(regexp_substr(str||',', '.*?' || ',', 1,
2), ',') AS cv
FROM t_str_row
SELECT id, 3 AS p, rtrim(regexp_substr(str||',', '.*?' || ',',1,3),
',') AS cv
FROM t_str_row
ORDER BY 1, 2;
适用范围:8i,9i,10g及以后版本
要创建一个可变数组:
CREATE OR REPLACE TYPE ins_seq_type IS VARRAY(8) OF NUMBER;
SELECT * FROM TABLE(ins_seq_type(1, 2, 3, 4, 5));
SELECT t.id,
c.column_value AS p,
substr(t.ca,
instr(t.ca, ',', 1, c.column_value) + 1,
instr(t.ca, ',', 1, c.column_value + 1) -
(instr(t.ca, ',', 1, c.column_value) + 1)) AS cv
FROM (SELECT id,
',' || str || ',' AS ca,
length(str || ',') - nvl(length(REPLACE(str, ',')), 0) AS cnt
FROM t_str_row) t
INNER JOIN TABLE(ins_seq_type(1, 2, 3)) c ON c.column_value
ORDER BY 1, 2;
7.3SEQUENCE SERIES
这类方法主要是要产生一个连续的整数列,产生连续整数列的方法有很多,主要有:
CONNECT BY,ROWNUM+all_objects,CUBE等。
适用范围:8i,9i,10g及以后版本
SELECT t.id,
c.lv AS p,
substr(t.ca,
instr(t.ca, ',', 1, c.lv) + 1,
instr(t.ca, ',', 1, c.lv + 1) -
(instr(t.ca, ',', 1, c.lv) + 1)) AS cv
FROM (SELECT id,
',' || str || ',' AS ca,
length(str || ',') - nvl(length(REPLACE(str, ',')), 0) AS cnt
FROM t_str_row) t,
(SELECT LEVEL lv FROM dual CONNECT BY LEVEL &= 5)
WHERE c.lv &= t.cnt
ORDER BY 1, 2;
SELECT t.id,
c.rn AS p,
substr(t.ca,
instr(t.ca, ',', 1, c.rn) + 1,
instr(t.ca, ',', 1, c.rn + 1) -
(instr(t.ca, ',', 1, c.rn) + 1)) AS cv
FROM (SELECT id,
',' || str || ',' AS ca,
length(str || ',') - nvl(length(REPLACE(str, ',')), 0) AS cnt
FROM t_str_row) t,
(SELECT rownum rn FROM all_objects WHERE rownum &=
WHERE c.rn &= t.cnt
ORDER BY 1, 2;
SELECT t.id,
c.cb AS p,
substr(t.ca,
instr(t.ca, ',', 1, c.cb) + 1,
instr(t.ca, ',', 1, c.cb + 1) -
(instr(t.ca, ',', 1, c.cb) + 1)) AS cv
FROM (SELECT id,
',' || str || ',' AS ca,
length(str || ',') - nvl(length(REPLACE(str, ',')), 0) AS cnt
FROM t_str_row) t,
(SELECT rownum cb FROM (SELECT 1 FROM dual GROUP BY CUBE(1, 2)))
WHERE c.cb &= t.cnt
ORDER BY 1, 2;
适用范围:10g及以后版本
SELECT t.id,
c.lv AS p,
rtrim(regexp_substr(t.str || ',', '.*?' || ',', 1, c.lv), ',') AS
FROM (SELECT id,
length(regexp_replace(str || ',', '[^' || ',' || ']', NULL)) AS
FROM t_str_row) t
INNER JOIN (SELECT LEVEL lv FROM dual CONNECT BY LEVEL
&= 5) c ON c.lv &= t.cnt
ORDER BY 1, 2;
7.4HIERARCHICAL + DBMS_RANDOM
适用范围:10g及以后版本
SELECT id,
LEVEL AS p,
rtrim(regexp_substr(str || ',', '.*?' || ',', 1, LEVEL), ',') AS
FROM t_str_row
CONNECT BY id = PRIOR id
AND PRIOR dbms_random.VALUE IS NOT NULL
AND LEVEL &=
length(regexp_replace(str || ',', '[^' || ',' || ']', NULL))
ORDER BY 1, 2;
7.5HIERARCHICAL + CONNECT_BY_ROOT
适用范围:10g及以后版本
SELECT id,
LEVEL AS p,
rtrim(regexp_substr(str || ',', '.*?' || ',', 1, LEVEL), ',') AS
FROM t_str_row
CONNECT BY id = connect_by_root id
AND LEVEL &=
length(regexp_replace(str || ',', '[^' || ',' || ']', NULL))
ORDER BY 1, 2;
适用范围:10g及以后版本
SELECT id, p, cv FROM t_str_row
RETURN UPDATED ROWS
PARTITION BY(ID)
DIMENSION BY( 0 AS p)
MEASURES( str||',' AS cv)
RULES UPSERT
length(regexp_replace(cv[0],'[^'||','||']',null))
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 oracle 函数写法 的文章

 

随机推荐