字符串轉數組:
(SELECT REGEXP_SUBSTR('34,56,-23', '[^,]+', 1, LEVEL, 'i') AS STR
FROM DUAL
CONNECT BY LEVEL <=
LENGTH('34,56,-23') - LENGTH(REGEXP_REPLACE('34,56,-23', ',', '')) + 1)
針對上面語法進行解析(轉載自https://blog.csdn.net/u012643122/article/details/78932709):
regexp_substr詳解:
regexp_substr函數格式如下:
function regexp_substr(String, pattern, position, occurrence, modifier)
__srcstr :要操作的字符串
__pattern :正則匹配規則字符串
__position :起始位置,1表示從第一個字符開始匹配
__occurrence :標識第幾個匹配組,默認為1
__modifier :模式('i’不區分大小寫進行檢索;‘c’區分大小寫進行檢索。默認為’c’。)
level解釋:
參數level是oracle的關鍵字,是一個偽列,偽劣的數據是oracle自動生成的,一般就是1、2、3等等這樣。
一般配合connect by一起使用。
connect by解釋:
connect by相當於查詢條件,在查詢字段中使用了level偽列時,必須使用connect by作為替代where來篩選偽列的值。
數組轉字符串 select wmsys.wm_concat(cityname) from sys_city where provinceid='29'
工作中的例子:sql如下
<!--查詢年級專業所做的方案的基本信息:
查專業方向碼,專業方向名稱,年級,學位授予,最短修業年限,最長修業年限,學制,國標專業名稱以及碼,方案簡介
-->
<select id="querySchemeBasicInfo" parameterType="java.lang.String" resultType="com.ly.education.cultivation.plan.api.vo.SchemeBasicInfoVo">
select
zyfx.zyfxmc as majorName,
zyfx.zyfxdm as majorCode,
nj.nj as gradeMajorYear,
nj.ZDXYNX as gradeMajorShortStudyLength,
nj.ZCXYNX as gradeMajorLongStudyLength,
nj.XZ as gradeMajorStudyLength,
gbzy.gbzymc as standardMajorName,
gbzy.gbzydm as standardMajorCode,
zyfa.FAJJ as schemeIntroduce,
(
<!-- 根據年級專業方向ID查詢對應的年級與學生類別碼從培養方案的版本信息表查詢版本名稱 -->
select
FABBMC
from T_PYFA_BBXX
where SYNF = (
select
NJ
from T_GGZY_NJZYFX@hxsj
where njzyfx_id = #{gradeMajorId,jdbcType=VARCHAR}
)
and XSLBM = (
select
XSLBM
from T_GGZY_NJZYFX@hxsj
where njzyfx_id = #{gradeMajorId,jdbcType=VARCHAR}
)
)as schemeVersionName,
<!-- 因為學位授予門類嗎這個字段可能是一個以逗號連接的字符串,即一個年級專業方向可以對應多個學位授予門類,需要t.DMH in一個數組 -->
(
select
wm_concat(t.DMMC)
from T_DMK_DMZ@Hxsj t
where t.DMBH='XWSYMLM'
and t.DMH in
(
SELECT
REGEXP_SUBSTR(nj.XWSYMLM, '[^,]+', 1, LEVEL, 'i') AS STR
FROM DUAL
CONNECT BY LEVEL <=
LENGTH(nj.XWSYMLM) - LENGTH(REGEXP_REPLACE(nj.XWSYMLM, ',', '')) + 1)
) as gradeMajorDegreeCategoryName
from T_GGZY_NJZYFX@hxsj nj
left join T_GGZY_ZYFX@hxsj zyfx
on zyfx.ZYFX_ID = nj.ZYFX_ID
left join T_GGZY_GBZY@hxsj gbzy
on gbzy.GBZY_ID = zyfx.GBZY_ID
left join T_PYFA_ZYFAJBXX zyfa
on zyfa.njzyfx_id = nj.njzyfx_id
where nj.njzyfx_id = #{gradeMajorId,jdbcType=VARCHAR}
</select>
