Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将表中列的逗号分隔值放入SQL in运算符中?_Sql_Sql Server_Sql Server 2014 - Fatal编程技术网

如何将表中列的逗号分隔值放入SQL in运算符中?

如何将表中列的逗号分隔值放入SQL in运算符中?,sql,sql-server,sql-server-2014,Sql,Sql Server,Sql Server 2014,我有一个表,它有一个列,我在其中存储一个逗号分隔的文本,每个逗号分隔的值都有一个单引号。这些值是员工ID。这就是它的样子 现在,我有一个SQL查询,需要将此列中的值放入SQLIN运算符中。大概是这样的: select * from EMPLOYEE_MASTER where EMPLOYEEID IN (select CM_CONFIG_VALUE from ADL_CONFIG_MAST_T where

我有一个表,它有一个列,我在其中存储一个逗号分隔的文本,每个逗号分隔的值都有一个单引号。这些值是员工ID。这就是它的样子

现在,我有一个SQL查询,需要将此列中的值放入SQLIN运算符中。大概是这样的:

select * 
from EMPLOYEE_MASTER 
where EMPLOYEEID IN (select CM_CONFIG_VALUE 
                     from ADL_CONFIG_MAST_T 
                     where CM_CONFIG_KEY like 'ATT_BIOMETRIC_OU_ID'
                    )
但这不起作用,执行查询时返回0行,而如果我像下面那样正常执行查询,它就起作用了

select * 
from EMPLOYEE_MASTER 
where EMPLOYEEID IN('9F3DD4B791554DDE','C9B90D62851D43AB','828CB9E6204B4DDC')
请建议我在这里应该做什么。我曾尝试使用子字符串删除第一个和最后一个字符,并假设单引号可能是问题所在,但这也不起作用

select * from EMPLOYEE_MASTER where EMPLOYEEID IN(select EMPLOYEEID from ADL_CONFIG_MAST_T where CM_CONFIG_KEY like 'ATT_BIOMETRIC_OU_ID')

列应与从tablename选择COLUMNNAME中的where COLUMNNAME相同。您可以创建一个临时变量,然后使用exec命令获得所需的结果

声明@temp varchar200 选择@temp=CM\u配置值 从ADL\u配置\u桅杆\T 其中CM_配置_键,如“ATT_生物识别_OU_ID” 执行官选择* 来自员工和主管 在“+@temp+ 试试这个:

DECLARE @ID VARCHAR(500);
DECLARE @Number VARCHAR(500);
DECLARE @comma CHAR;

SET @comma = ','
SET @ID = (select CM_CONFIG_VALUE 
                     from ADL_CONFIG_MAST_T 
                     where CM_CONFIG_KEY like %ATT_BIOMETRIC_OU_ID% + @comma);

Create table #temp (EMPLOYEEID varchar(500))
WHILE CHARINDEX(@comma, @ID) > 0
BEGIN
    SET @Number = SUBSTRING(@ID, 0, CHARINDEX(@comma, @ID))
    SET @ID = SUBSTRING(@ID, CHARINDEX(@comma, @ID) + 1, LEN(@ID))

    Insert into #temp
    select @Number

END
select * 
from EMPLOYEE_MASTER 
where EMPLOYEEID IN(select EMPLOYEEID from #temp)

在查询中没有得到它的原因是因为内部查询只返回一行。因此,您的查询将“9F3DD4B791554DDE”、“C9B90D62851D43AB”、“828CB9E6204B4DDC”作为单个记录进行搜索

如果您的兼容性级别大于或等于130,则可以使用STRING_SPLIT函数。那么你的问题就是

SELECT *
FROM EMPLOYEE_MASTER
WHERE EMPLOYEEID IN 
    (SELECT value AS empid
    FROM ADL_CONFIG_MAST_T CROSS APPLY string_split(CM_CONFIG_VALUE, ',' )
    WHERE CM_CONFIG_KEY LIKE 'ATT_BIOMETRIC_OU_ID' )
实际上,它将CM_CONFIG_值与“,”分开,并将它们作为行返回。这是我提到的值列。然后将它们与IN子句一起使用

希望这有帮助

直接输入条件在此处不起作用。搜索前已拆分字符串。您可以使用SQL SERVER 2014中的XML选项来实现这一点


对于2016版及以上版本,您可以与兼容级别130一起使用

您使用的SQL Server版本是什么?@Yogesharma SQL Server 2014您可以使用字符串分割功能。但我认为它是在SQL Server 2015中引入的。在SQL Server 2015中,我存储了一个逗号分隔的文本,每个逗号分隔的值都带有单引号。不。每行存储一项。我在where子句中使用列名CM_CONFIG_VALUE的原因是,CM_CONFIG_VALUE应该存储以逗号分隔的员工ID列表,我的要求是我需要根据该列中的员工ID查找数据。表ADL\U CONFIG\U MAST\U T.ok中不存在EMPLOYEEID列。在这种情况下,使用join.in查询在此场景中不起作用。我已在临时表上对其进行了测试,效果良好。使用这种方法,最后创建的查询是select*from EMPLOYEE_MASTER where EMPLOYEE_ID INselect CM_CONFIG_VALUE wfrom ADL_CONFIG_MAST where CM_CONFIG_KEY like'ATT_BIOMETRIC_OU_ID%'并再次返回0行。您面临什么问题?
SELECT *
FROM EMP
WHERE EMPID IN (
      SELECT a.c.value('.', 'VARCHAR(1000)')
           FROM (
                 SELECT x = CAST('<a>' + 
                 REPLACE(REPLACE(CM_CONFIG_VALUE , ',', '</a><a>'),'''','') + '</a>' AS XML  ) 
                 FROM ADL_CONFIG_MAST_T
               -- WHERE <your_condition>
                ) m
      CROSS APPLY x.nodes('/a') a(c))