You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将表中列的带单引号逗号分隔员工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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:10:12