SQL 处理IN和合并字符串
需求概述
查询以逗号隔开的员工编号列表数据里对应的员工编号、员工名称、工资、部门编号。如传来的员工列表是'7654,7698,7782,7788'。
注:表和数据详见
问题分析
首先SQL是不能直接处理合并后的字符串的数据,但是如果把合并的字符串转成单个的值并组成集合是可以的。
SQL代码
-- 方法一 通过构造自增表结合substring_index拆分字符串。
select empno, ename, sal, deptno
from emp
where empno in
(
select substring_index(
substring_index(list.vals,',',iter.pos),',',-1) empno
from (SELECT ORDINAL_POSITION pos FROM information_schema.`COLUMNS`
WHERE TABLE_NAME = 'table_lock_waits_summary_by_table') as iter,
(select '7654,7698,7782,7788' as vals
from dual) list
where iter.pos <=
(length(list.vals)-length(replace(list.vals,',','')))+1
)
-- 方法二 类似方法一,这里将顶定义个拆分函数,然后遍历。
WITH CTE AS
(SELECT '7654,7698,7782,7788' str)
select empno, ename, sal, deptno
from emp
where empno in
(
SELECT split_string(str,',',num) splitstr
FROM
(
SELECT str,LENGTH(str) - LENGTH(REPLACE(str,',','')) +1 len
FROM CTE
)A
JOIN
( -- 构造自增辅助表,最大值为70左右。
SELECT ORDINAL_POSITION num FROM information_schema.`COLUMNS`
WHERE TABLE_NAME = 'table_lock_waits_summary_by_table'
)B
ON B.num <=A.len
)