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
)

执行结果

处理字符串_14_SQL处理IN和合并后字符串案例详解_mysql