日期:2014-05-17  浏览次数:20844 次

sql中截取字符串,怎么写?
例如:

类似这样的值:DEPT_BMLD_BSTAZM00 ,DEPT_JSSLD_BSTAZ09

我要截取出 BMLD 和 BSTAZM00

根据下划线截取怎么写SQL呢?



------解决方案--------------------
SQL code
select regexp_substr('DEPT_BMLD_BSTAZM00', '[^_]+', 1, level) from dual
connect by level <= length(regexp_replace('DEPT_BMLD_BSTAZM00', '[^_]+', null))+1

------解决方案--------------------
探讨
引用:
这条语句在DB2中报错啊,!有更简单的方式吗?

------解决方案--------------------
按照要求截的……
SQL code
SELECT SUBSTR('DEPT_BMLD_BSTAZM00',INSTR('DEPT_BMLD_BSTAZM00','_',1,1)+1,
INSTR('DEPT_BMLD_BSTAZM00','_',1,2)-INSTR('DEPT_BMLD_BSTAZM00','_',1,1)-1 ) ,
SUBSTR('DEPT_BMLD_BSTAZM00',INSTR('DEPT_BMLD_BSTAZM00','_',1,2)+1 ) FROM DUAL

------解决方案--------------------
如果只有两个下划线,可以用这个写法,应该是通用的。

SELECT SUBSTR(item,1,instr(item,'_') -1) AS fst,
SUBSTR(item,instr(item,'_') + 1,instr(item,'_',instr(item,'_') + 1) - instr(item,'_') - 1 ) AS scd /*instr的特殊用法,指定起始位置instr(item,'_',从第一个下划线后一个位置开始)*/
FROM
( SELECT 'aaa_bbb_ccc' AS item FROM dual
UNION ALL
SELECT 'dd_ee_ff' AS item FROM dual
)
--结果
FST SCD
----------- ----------- 
aaa bbb
dd ee
------解决方案--------------------
探讨
SQL code
select regexp_substr('DEPT_BMLD_BSTAZM00', '[^_]+', 1, level) from dual
connect by level <= length(regexp_replace('DEPT_BMLD_BSTAZM00', '[^_]+', null))+1

结果:
DEPT
BMLD
BSTAZM00