使用SQL如何把用逗號等字元隔開的字串轉換成列表

2021-05-27 00:14:53 字數 3191 閱讀 3944

如何把用逗號等字元隔開的字串轉換成列表,下面依逗號分隔符為例:

比如有乙個字串,其值為:香港,張家港,北京,上海

用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 c

from(

select a,instr(a,',',1,level) b,level lv from a

connect 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 c

from(select a,instr(a,',',1,level) b,level lv from a

connect by level <=(length(a) - length(replace(a,',','')))+1

)))2、方法二:使用oracle regexp_substr中的正規表示式

with temp as

(select '香港,張家港,北京,上海,95,aa' text

from dual)

select regexp_substr (text, '[^,]+', 1, rn) city

from temp t1,

(select     level rn

from dual

connect by level <=

(select   length (text)

- length (replace (text, ',', ''))

+ 1from temp)) t2

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

select answer from fw_answer

answer

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

a,b,c

a,fb,d,e

d要把逗號分隔的轉列換成行顯示,這裡使用了substr的方式,如下:

select substr(answer,instr(','||answer|| ',', ',', 1, t2.row_num),

instr(','||answer|| ',', ',', 1, t2.row_num+1)-1-instr(','||answer, ',', 1, t2.row_num)) answer

from fw_answer t1,(select rownum row_num from user_objects where rownum<= 10) t2

where 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

-----------------aa

bbcd

def【如果是使用其他字元分隔的,以上方式也可以,只需要將有逗號的地方換成該字元。】 

以上方式是針對字元儲存無規律的情況,對於fw_answer表中的答案列是有規律可循的,所以簡化後的sql如下:

select substr(answer,t2.row_num*2-1,1) answer

from fw_answer t1,(select rownum row_num from user_objects where rownum<= 10) t2

where 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  a

1  b

1  c

2  a

2  b

3  c

3  f

4  d

轉換後變成:
1  a,b,c

2  a,b

3  c,f

4  d

方法:

假設你的表結構是tb_name(id, remark),則語句如下:

select a.id, wm_concat (a.remark) new_result from tb_name a group by a.id

字串 把字串轉換成整數

將乙個字串轉換成乙個整數,要求不能使用字串轉換整數的庫函式。數值為0或者字串不是乙個合法的數值則返回0 輸入描述 輸入乙個字串,包括數字字母符號,可以為空 返回值描述 如果是合法的數值表達則返回該數字,否則返回0 示例1輸入 2147483647 返回值 示例2 1a33 返回值 這題比較簡單,使用...

把字串轉換成整數

題目 輸入乙個表示整數的字串,把該字串轉換成整數並輸出。例如輸入字串 345 則輸出整數345 分析 這道題儘管不是很難,學過c c 語言一般都能實現基本功能,但不同程式設計師就這道題寫出的 有很大區別,可以說這道題能夠很好地反應出程式設計師的思維和程式設計習慣,因此已經被包括微軟在內的多家公司用作...

把字串轉換成整數

題目 輸入乙個表示整數的字串,把該字串轉換成整數並輸出。例如輸入字串 345 則輸出整數 345。分析 這道題儘管不是很難,學過c c 語言一般都能實現基本功能,但不同程式設計師就這道題寫出的 有很大區別,可以說這道題能夠很好地反應出程式設計師的思維和程式設計習慣,因此已經被包括微軟在內的多家公司用...