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

Posted ShenLiang2025

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了处理字符串_14_SQL处理IN和合并后字符串案例详解相关的知识,希望对你有一定的参考价值。

SQL 处理IN和合并字符串

需求概述

查询以逗号隔开的员工编号列表数据里对应的员工编号、员工名称、工资、部门编号。如传来的员工列表是'7654,7698,7782,7788'。

注:表和数据详见

SQL 100+个最佳入门案例实践(覆盖Oralce、SQL Server、mysql)之基础操作_1_检索数据_数据科学汇集-CSDN博客7.1 数据集见如下SQL,以Oracle为例:-- DROP TABLE EMP;-- DROP TABLE DEPT;-- DROP TABLE BONUS;-- DROP TABLE SALGRADE;CREATE TABLE DEPT(DEPTNO NUMBER(2) NOT NULL CONSTRAINT pk_dept_deptno primary key,DNAME Vhttps://shenliang.blog.csdn.net/article/details/70145965

问题分析

首先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和合并后字符串案例详解的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 上机练习

SQL数据处理,字符串先拆分后合并

Python学习之五_字符串处理生成查询SQL

合并_10jquery(3days)笔记

java.sql.Exception:setString 只能处理少于 32766 个字符的字符串

SQL Not IN 查询需要时间处理类似的表