盒子
盒子
文章目录
  1. 1. 项目需求
  2. 2. 开始分离
  3. 3. 注意事项
  4. 4.最终SQL语句

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

1. 项目需求

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

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

1

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

2. 开始分离

1
2
3
4
5
6
7
8
9
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 --该句不变

分离为多行结果:

2

3. 注意事项

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

1
2
3
4
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语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
支持一下
扫一扫,支持沈健
  • 微信扫一扫
  • 支付宝扫一扫