Oracle单字段字符串分割由一行改为多行

1. 项目需求

虚拟核销中,若起草人离职,则已办视图项目客户专员无法查看,故需新增虚拟核销项目对应客户专员查看权限。

SELECT ID,PROJECTNO, CREATOR FROM FORM_MADJ_ACCOUNT WHERE ID IN('8cfa11ee-6ef4-448a-b75b-d7c99c96a76b', 'bf7ca28c-6d97-48b7-ad6e-a7398b5a11e4')

可见,项目中存在多项目编号,|分割,故首先分离项目

2. 开始分离

	SELECT DISTINCT
		ID,
		REGEXP_SUBSTR( PROJECTNO, '[^|]+', 1, LEVEL ) AS PROJECTNO -- 搜索正则匹配的串
	FROM
		YDAMS.FORM_MADJ_ACCOUNT 
	WHERE ID='8cfa11ee-6ef4-448a-b75b-d7c99c96a76b'
		CONNECT BY LEVEL <= REGEXP_COUNT ( PROJECTNO, '|' ) + 1  -- level关键字,代表树形结构中的层级编号
		AND ID = PRIOR ID  -- 主键ID 表示从下往上查找数据,可以理解为从叶子节点往上查找父级节点点
		AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL --该句不变

分离为多行结果:

3. 注意事项

由于在子查询中ID无法使用外部别名ID,故采用左连接查询方式
注:项目表中存在项目客户专员信息

SELECT DISTINCT id FROM table_name ORDER BY number DESC;

--- 运行时往往会报错。因为在order by中出现的number没有在select distinct中出现,所以正确的写法应该是 
SELECT DISTINCT id, number FROM table_name ORDER BY number DESC;

4.最终SQL语句

	SELECT
		DISTINCT FMA.ID, 
		FMA.PROJECTNO,
		to_char(fma.create_date,'yyyy-mm-dd hh24:mi:ss') as create_date,
		FMA.CREATE_DATE CREATE_DATE2 -- 注意这个在ORDER BY中存在,必须写否则会报错
	FROM
		FORM_MADJ_ACCOUNT FMA
		LEFT JOIN sys_user SU ON FMA.CREATOR = SU.ID
		LEFT JOIN (
			SELECT DISTINCT
				ID,
				REGEXP_SUBSTR( PROJECTNO, '[^|]+', 1, LEVEL ) AS PROJECTNO 
			FROM
				YDAMS.FORM_MADJ_ACCOUNT CONNECT BY LEVEL <= REGEXP_COUNT ( PROJECTNO, '|' ) + 1 
				AND ID = PRIOR ID 
				AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL 
			) PSI ON FMA.ID = PSI.ID
		LEFT JOIN PROJ_INFO pi ON pi.PROJECTNO = PSI.PROJECTNO 
	WHERE
		FMA.STATUS = 1 
		AND (SU.LOGINNAME = 'XXX' OR PI.PROJECT_MANAGER_ID = '08BA5F8B2CC4FC29E05010ACB550646D' ) 
	ORDER BY
		FMA.CREATE_DATE DESC

欢迎关注公众号算法小生

猜你喜欢

转载自blog.csdn.net/SJshenjian/article/details/130901025
今日推荐