簡體   English   中英

如何將表中列中的逗號分隔值放入 SQL IN 運算符中?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM