字符串转数组: (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>