[英]How to put a comma separated value from a column in a table into SQL IN operator?
我有一個表,其中有一列,我在其中存儲一個逗號分隔的文本,每個逗號分隔值都帶有單引號。 這些值是員工 ID。 這是它的樣子
現在,我有一個 SQL 查詢,其中我需要將此列中的值放入 SQL IN 運算符中。 像這樣的東西:
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')
請建議我應該在這里做什么。 我曾嘗試使用 substring 刪除第一個和最后一個字符,並假設單引號可能是問題所在,但這也不起作用。
select * from EMPLOYEE_MASTER where EMPLOYEEID IN(select EMPLOYEEID from ADL_CONFIG_MAST_T where CM_CONFIG_KEY like 'ATT_BIOMETRIC_OU_ID')
列應該在 COLUMNNAME IN 中相同(從表名中選擇 COLUMNNMAE)
您可以創建一個臨時變量,然后使用exec
命令來獲得所需的結果。
declare @temp varchar(200)
select @temp=CM_CONFIG_VALUE
from ADL_CONFIG_MAST_T
where CM_CONFIG_KEY like 'ATT_BIOMETRIC_OU_ID'
exec('select *
from EMPLOYEE_MASTER
where EMPLOYEEID IN (' + @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'
作為單個記錄搜索。
如果您的compatibility level
大於或等於 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_VALUE 與 ',' 分開,並將它們作為行返回。 這是我提到的值列。 然后將它們與 IN 子句一起使用。
希望這可以幫助!
直接IN
條件在這里不起作用。 您在搜索之前已拆分字符串。 您可以使用SQL SERVER 2014
XML
選項來做到這一點
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))
對於 2016 及更高版本,您可以使用兼容性級別為 130 的STRING_SPLIT
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.