Oracle列转行的一种实现方法

在做OA表单开发的时候,经常会碰到一个字段用逗号或者其他分隔符存多个信息,例如一张表单中有一个附件控件,存储了多个附件的ID,中间用逗号隔开,这时候我们如果要通过附件ID抓取附件详细信息,如果使用LIKE,效率不高,因此需要将这个字段通过逗号分隔行转列。

注:该方法是在Oracle数据库中实现的,SQL Server或者Mysql 需要进行修改。

下面是实现的示例:

数据格式如:

QQ截图20180710155926

实现代码:

SELECT
	T.ID,
	T.INSTANCEID,
	T.TITLE,
	T.SNO,
	A.ID AS ATTACHID,
  '附件:'||A.SOURCEFILE AS SOURCEFILE,
  '0' AS TYPE
FROM
(
	SELECT
		DISTINCT
		ID,
		INSTANCEID,
		TITLE,
		SNO,
		SUBSTR(T.CA,INSTR(T.CA, ',', 1, C.LV) + 1,INSTR(T.CA, ',', 1, C.LV + 1) - (INSTR(T.CA, ',', 1, C.LV) + 1)) AS FUJIAN
	FROM
	(
		SELECT
			C.ID,
			C.INSTANCEID,
			C.TITLE,
			C.SNO,
			',' || FUJIAN || ',' AS CA,
		LENGTH(FUJIAN || ',') - NVL(LENGTH(REPLACE(FUJIAN, ',')), 0) AS CNT
		FROM
			XMHX_XZ_JSTZTBZZ C
		WHERE
			FUJIAN IS NOT NULL
	) T,
	(
		SELECT
			LEVEL LV
		FROM
			DUAL CONNECT BY LEVEL <= 50 --其中“LEVEL <= 50”中的数字50代表匹配字段内容中出现逗号的次数
	) C
) T
LEFT JOIN EFORM_ATTACH A ON T.FUJIAN=A.ID
WHERE T.FUJIAN IS NOT NULL

发布者

虚妄的存在感

我尊重你的存在感,但我鄙视你虚妄的存在感。