如何将表中列的带单引号逗号分隔员工ID传入SQL IN运算符?
解决带单引号的逗号分隔ID传入IN子句的问题
这个问题我之前也碰到过,核心原因是你原查询里的子查询返回的是一个完整的字符串(比如'9F3DD4B791554DDE','C9B90D62851D43AB','828CB9E6204B4DDC'),而SQL的IN运算符会把这个字符串当成单个匹配值去和EMPLOYEEID比对,自然找不到对应记录。我们需要先把这个字符串拆分成独立的员工ID,再传入IN中。
下面分常见数据库给出具体解决方案:
1. SQL Server(2016+)
用STRING_SPLIT函数配合字符串清洗来拆分ID:
SELECT * FROM EMPLOYEE_MASTER WHERE EMPLOYEEID IN ( -- 拆分后清理每个ID的单引号 SELECT TRIM('''' FROM value) AS emp_id FROM ADL_CONFIG_MAST_T -- 先去掉字符串首尾的单引号,再把中间的''',''替换成逗号,最后拆分 CROSS APPLY STRING_SPLIT( REPLACE(TRIM('''' FROM CM_CONFIG_VALUE), ''',''', ','), ',' ) WHERE CM_CONFIG_KEY LIKE 'ATT_BIOMETRIC_OU_ID' )
步骤解析:
TRIM('''' FROM CM_CONFIG_VALUE):去掉字符串首尾的单引号(SQL Server中用两个单引号转义)REPLACE(..., ''',''', ','):把中间的','替换成单个逗号,得到纯ID的逗号分隔串STRING_SPLIT按逗号拆分后,再清理每个ID可能残留的单引号
2. MySQL(8.0+)
推荐用REGEXP_SUBSTR结合字符串清洗,写法更简洁:
SELECT e.* FROM EMPLOYEE_MASTER e JOIN ( SELECT -- 匹配单引号之间的内容并清理 TRIM('''' FROM REGEXP_SUBSTR( -- 先去掉首尾的单引号 SUBSTRING(CM_CONFIG_VALUE, 2, LENGTH(CM_CONFIG_VALUE)-2), '[^'']+' )) AS emp_id FROM ADL_CONFIG_MAST_T WHERE CM_CONFIG_KEY LIKE 'ATT_BIOMETRIC_OU_ID' ) s ON e.EMPLOYEEID = s.emp_id;
如果是MySQL 5.x版本,可以用递归CTE或者自定义函数来拆分字符串,不过8.0+的正则方案更高效。
3. Oracle
用REGEXP_SUBSTR配合CONNECT BY来生成多行ID:
SELECT * FROM EMPLOYEE_MASTER WHERE EMPLOYEEID IN ( SELECT TRIM('''' FROM REGEXP_SUBSTR( -- 去掉首尾单引号 SUBSTR(CM_CONFIG_VALUE, 2, LENGTH(CM_CONFIG_VALUE)-2), -- 匹配单引号之间的ID内容 '[^'']+', 1, LEVEL )) AS emp_id FROM ADL_CONFIG_MAST_T WHERE CM_CONFIG_KEY LIKE 'ATT_BIOMETRIC_OU_ID' -- 循环拆分直到所有ID都被提取 CONNECT BY REGEXP_SUBSTR( SUBSTR(CM_CONFIG_VALUE, 2, LENGTH(CM_CONFIG_VALUE)-2), '[^'']+', 1, LEVEL ) IS NOT NULL -- 避免同一行产生循环 AND PRIOR CM_CONFIG_KEY = CM_CONFIG_KEY AND PRIOR SYS_GUID() IS NOT NULL )
备选方案:动态SQL(通用但需注意风险)
如果上述函数都无法使用,可以用动态SQL拼接完整查询语句:
以SQL Server为例:
DECLARE @sql NVARCHAR(MAX) -- 直接把配置值拼到IN子句里 SELECT @sql = 'SELECT * FROM EMPLOYEE_MASTER WHERE EMPLOYEEID IN (' + CM_CONFIG_VALUE + ')' FROM ADL_CONFIG_MAST_T WHERE CM_CONFIG_KEY LIKE 'ATT_BIOMETRIC_OU_ID' EXEC sp_executesql @sql
⚠️ 注意:动态SQL存在SQL注入风险,只有当CM_CONFIG_VALUE的内容是完全可信的情况下才推荐使用。
内容的提问来源于stack exchange,提问作者TVicky
相关产品推荐
相关产品推荐

