Oracle行转列

limeng_zxj 2010-05-20 02:41:18
select distinct '1' t1,'2' t2,'3' t3,'4' t4 from table 查出来的结果为
1,2,3,4
我想得以下这样的效果
1
2
3
4
请问一下有什么办法可以解决???
...全文
209 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xieyu_zy 2010-06-05
  • 打赏
  • 举报
回复
不好意思,补充一下,请LZ在创建函数前,先执行一下这个语句,创建一个数据类型:
CREATE OR REPLACE TYPE MY_TABLE_TYPE IS TABLE OF VARCHAR2(8000);
xieyu_zy 2010-06-05
  • 打赏
  • 举报
回复
LZ是要将行转成列是吧,如果你要做一个较为通用的,我也有办法,因为曾经研究对于动态绑定InList参数的验结果,用到过类似的东西,首先写一个公共函数,将数据组装成一个内存数组:

CREATE OR REPLACE FUNCTION SPLIT(SRC_STR IN VARCHAR2,

SPLIT_STR VARCHAR2) RETURN MY_TABLE_TYPE IS
V_TABLE_STR MY_TABLE_TYPE := MY_TABLE_TYPE();
V_TEMP_STR VARCHAR2(8000) := SRC_STR;
V_SPLIT_STR VARCHAR2(20) := SPLIT_STR;
I NUMBER := 1;
J NUMBER := 1;
BEGIN

IF V_SPLIT_STR IS NULL THEN
V_SPLIT_STR := ',';--我们默认用逗号分隔
END IF;

IF SRC_STR IS NULL OR SRC_STR = V_SPLIT_STR THEN
RETURN V_TABLE_STR;
END IF;

V_TEMP_STR := LTRIM(V_TEMP_STR, V_SPLIT_STR);

LOOP
I := INSTR(V_TEMP_STR, V_SPLIT_STR, J);
EXIT WHEN I = 0 OR J > LENGTH(V_TEMP_STR);
V_TABLE_STR.EXTEND;
V_TABLE_STR(V_TABLE_STR.COUNT) := SUBSTR(V_TEMP_STR, J, I - J);
J := I + LENGTH(V_SPLIT_STR);
END LOOP;

IF J < LENGTH(V_TEMP_STR) THEN
V_TABLE_STR.EXTEND;
V_TABLE_STR(V_TABLE_STR.COUNT) := SUBSTR(V_TEMP_STR, J, LENGTH(V_TEMP_STR) - J + 1);
END IF;

RETURN V_TABLE_STR;

END SPLIT;


写完公共函数后可以做一个测试了,如果你是较高版本的数据库就这样使用:

SQL> SELECT * FROM TABLE(SPLIT('123,321',','));

COLUMN_VALUE

--------------------------------------------------------------------------------
123
321



如果你是较低版本的数据库,就这样使用:
SQL> SELECT * FROM TABLE(CAST(SPLIT('123,321,456', ',') AS MY_TABLE_TYPE));



COLUMN_VALUE

--------------------------------------------------------------------------------
123
321
456


SQL可以动态绑定任何参数进入,只要传入的规格和实际的规格一致即可。上述函数可以任意使用,只要拆开的个数不是太多,对性能影响不算大。
浪尖赏花 2010-06-01
  • 打赏
  • 举报
回复
没必要搞这么复杂,直接union all就行了
HDZC 2010-06-01
  • 打赏
  • 举报
回复
SELECT t1.card_code, substr(MAX(sys_connect_by_path(t1.q, ';')), 2) q
FROM (SELECT a.card_code,
a.q,
row_number() over(PARTITION BY a.card_code ORDER BY a.q) rn
FROM t_change_lc_comma a) t1
START WITH t1.rn = 1
CONNECT BY t1.card_code = PRIOR t1.card_code
AND t1.rn - 1 = PRIOR t1.rn
GROUP BY t1.card_code;
s_hli2 2010-05-31
  • 打赏
  • 举报
回复
[Quote=引用楼主 limeng_zxj 的回复:]
select distinct '1' t1,'2' t2,'3' t3,'4' t4 from table 查出来的结果为
1,2,3,4
我想得以下这样的效果
1
2
3
4
请问一下有什么办法可以解决???
[/Quote]


select decode(c.rn,1,t1,2,t2,3,t3,4,t4)
from (select a.*,b.rn from lhx_tmp a,
(select rownum rn from dual connect by rownum < 5) b) c
order by 1
lzt2008 2010-05-21
  • 打赏
  • 举报
回复
可以用decode判断
decode(a,1,b,2,c,3,d,4) 判断如果=a 则值为1 。。。。。
suncrafted 2010-05-21
  • 打赏
  • 举报
回复
ORACLE 11g 新函数:
行转列:
WITH TEMP AS
(SELECT '1' T1,
'2' T2,
'3' T3,
'4' T4
FROM DUAL)
SELECT *
FROM TEMP UNPIVOT(T_VALUE FOR T_TYPE IN(T1 AS 'T1', T2 AS 'T2',
T3 AS 'T3', T4 AS 'T4'))


列转行:
WITH TEMP AS
(SELECT 'T1' T_TYPE,'1' T_VALUE FROM DUAL UNION
SELECT 'T2' T_TYPE, '2' T_VALUE FROM DUAL UNION
SELECT 'T3' T_TYPE, '3' T_VALUE FROM DUAL UNION
SELECT 'T4' T_TYPE, '4' T_VALUE FROM DUAL )
SELECT *
FROM TEMP PIVOT(MAX(T_VALUE) FOR T_TYPE IN('T1' AS T1, 'T2' AS T2,
'T3' AS T3, 'T4' AS T4))
刘痕 2010-05-20
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20100508/14/39983236-42ff-4223-8962-cfdd14130975.html
看这里!
心中的彩虹 2010-05-20
  • 打赏
  • 举报
回复

union all --吧
Phoenix_99 2010-05-20
  • 打赏
  • 举报
回复
with temp as(
select '1' t1,'2' t2,'3' t3,'4' t4 from dual
)
select t1 from temp
union all
select t2 from temp
union all
select t3 from temp
union all
select t4 from temp
ojuju10 2010-05-20
  • 打赏
  • 举报
回复
没有好的方法,用union,一条条记录拼接

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧