1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 使用SQL如何把用逗号等字符隔开的字符串转换成列表 以及把列合并成符合隔开的字符串(

使用SQL如何把用逗号等字符隔开的字符串转换成列表 以及把列合并成符合隔开的字符串(

时间:2019-12-12 05:27:55

相关推荐

使用SQL如何把用逗号等字符隔开的字符串转换成列表 以及把列合并成符合隔开的字符串(

如何把用逗号等字符隔开的字符串转换成列表,下面依逗号分隔符为例:

比如有一个字符串,其值为:香港,张家港,北京,上海

用SQL把这个字符串转换成列表的方法是:

1、方法一

WITH A AS (SELECT '香港,张家港,北京,上海' A FROM DUAL)SELECT DECODE(B,0,SUBSTR(A,C),SUBSTR(A,C,B-C)) city FROM(SELECT A,B,(LAG(B,1,0) OVER(ORDER BY LV))+1 CFROM(SELECT A,INSTR(A,',',1,LEVEL) B,LEVEL LV FROM ACONNECT BY LEVEL <=(LENGTH(A) - LENGTH(REPLACE(A,',','')))+1))

输出结果是:

香港张家港北京上海

应用举例:

如果table1表的city字段的值为:北京;table2表的city字段的值为:香港,张家港,北京,上海

要想用city字段关联table1,table2表来查询table1表中的数据,首先我们会想到用(例:select * from table1 where field in (select field from table2))方式来查询,但是这样查询的结果却不正确,仔细观察会发现如果用in时,table2表的city字段的值必须得是('香港','张家港','北京','上海')格式,这样查询的结果才会正确,这时如果我们使用下面的SQL就可帮我们解决这个问题了。

例:select * from table where field in ( WITH A AS (SELECT (select field from table2) A FROM DUAL)SELECT DECODE(B,0,SUBSTR(A,C),SUBSTR(A,C,B-C)) city FROM(SELECT A,B,(LAG(B,1,0) OVER(ORDER BY LV))+1 CFROM(SELECT A,INSTR(A,',',1,LEVEL) B,LEVEL LV FROM ACONNECT BY LEVEL <=(LENGTH(A) - LENGTH(REPLACE(A,',','')))+1)))

2、方法二:使用Oracleregexp_substr中的正则表达式

WITH temp AS(SELECT '香港,张家港,北京,上海,95,aa' textFROM DUAL)SELECT regexp_substr (text, '[^,]+', 1, rn) cityFROM temp t1,(SELECTLEVEL rnFROM DUALCONNECT BY LEVEL <=(SELECT LENGTH (text)- LENGTH (REPLACE (text, ',', ''))+ 1FROM temp)) t2

3、方法三:使用的表(FW_ANSWER)

select answer from fw_answerANSWER----------------- A,B,CA,FB,D,ED

要把逗号分隔的转列换成行显示,这里使用了substr的方式,如下:

select substr(answer,instr(','||answer|| ',', ',', 1, t2.row_num),instr(','||answer|| ',', ',', 1, t2.row_num+1)-1-instr(','||answer, ',', 1, t2.row_num)) answerfrom fw_answer t1,(select rownum row_num from user_objects where rownum<= 10) t2where nvl(substr(answer,instr(','||answer||',', ',', 1, t2.row_num),instr(','||answer||',', ',', 1, t2.row_num+1)-1-instr(','||answer, ',', 1, t2.row_num)),'-')!='-'order by answer

查询结果:

ANSWER----------------- AABBCDDEF

【如果是使用其他字符分隔的,以上方式也可以,只需要将有逗号的地方换成该字符。】

以上方式是针对字符存储无规律的情况,对于fw_answer表中的答案列是有规律可循的,所以简化后的sql如下:

select substr(answer,t2.row_num*2-1,1) answerfrom fw_answer t1,(select rownum row_num from user_objects where rownum<= 10) t2where nvl(substr(answer,t2.row_num*2-1,1),'-')!='-'order by answer

【注:user_objects主要描述当前用户通过DDL建立的所有对象。包括表、视图、索引、存储过程、触发器、

包、索引、序列等。是oracle字典表的视图。这里也可以通过其它方式,如dual,此处为了免去content by

所以不用dual,用user_objects。】

------------------------------------------------------------------------------------------------------

正好相反的操作:把列转换成行

从网上找了都是关于decode的方法实现的列转行,后来发现了用orcale的wmsys.wm_concat方法可以轻松的实现,下面的范例是网上找的:wmsys.wm_concat要10g以后才可以。

表结构: 1 A1 B1 C2 A2 B3 C3 F4 D转换后变成:1 A,B,C2 A,B3 C,F4 D

方法:

假设你的表结构是tb_name(id, remark),则语句如下:

SELECT a.id, wm_concat (a.remark) new_result FROM tb_name a group by a.id

使用SQL如何把用逗号等字符隔开的字符串转换成列表 以及把列合并成符合隔开的字符串(转)...

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。