如何把用逗號等字元隔開的字串轉換成列表,下面依逗號分隔符為例:
比如有乙個字串,其值為:香港,張家港,北京,上海
用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 a1 b
1 c
2 a
2 b
3 c
3 f
4 d
轉換後變成:
1 a,b,c2 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 語言一般都能實現基本功能,但不同程式設計師就這道題寫出的 有很大區別,可以說這道題能夠很好地反應出程式設計師的思維和程式設計習慣,因此已經被包括微軟在內的多家公司用...