如何在 SQL 服务器中使用 IN 与 Select

How to use IN in SQL Server with Select

SELECT CATEGORY 
FROM PEA_TEMPLATE  
WHERE TEMP_ID = 000001 AND TEMP_VERSION = 2

此查询 returns '000001','000002' 以这种格式保存在 CATEGORY 列中。

SELECT * 
FROM HR_CATEGORY 
WHERE CAT_CODE IN ('000001', '000002')

这个 select 可以很好地处理行字符串

SELECT * 
FROM HR_CATEGORY 
WHERE CAT_CODE IN (SELECT CATEGORY 
                   FROM PEA_TEMPLATE  
                   WHERE TEMP_ID = 000001 AND TEMP_VERSION = 2)

但是当我在 IN 中使用查询时,它 return 没有任何值。

这是什么原因?有什么办法可以解决这个问题?

您尝试过调整值吗?

TRIM()

SELECT * 
FROM HR_CATEGORY 
WHERE TRIM(CAT_CODE) IN (SELECT TRIM(CATEGORY) 
                   FROM PEA_TEMPLATE  
                   WHERE TEMP_ID = 000001 AND TEMP_VERSION = 2)

可能你也有 NULL category。尝试将 AND category IS NOT NULL 添加到最后一个 WHERE。

尝试在以下 CATEGORY 上使用 CAST

SELECT * 
FROM HR_CATEGORY 
WHERE CAT_CODE IN (SELECT CAST(CATEGORY AS NVARCHAR(20)) 
                   FROM PEA_TEMPLATE  
                   WHERE TEMP_ID = 000001 AND TEMP_VERSION = 2)
 go with FIND_IN_SET insted of in 

我希望这能解决你的问题

您的子查询只返回一行内容:

"'000001','000002'"

要使 IN 子句起作用,每个值必须分隔为两行:

'000001'

'000002'

您必须将 CATEGORY 列中的值拆分为多个字符串。为此,您可以使用字符串拆分函数。网上有很多,这里有一个相关的问答T-SQL: Opposite to string concatenation - how to split string into multiple records

如果 CATEGORY 可以使用撇号连接字符串,例如'000001''000001','000002',那么最好使用 LIKE 和 JOIN 构造,像这样:

SELECT * FROM HR_CATEGORY 
INNER JOIN 
  (SELECT CATEGORY FROM PEA_TEMPLATE WHERE TEMP_ID = 000001 AND TEMP_VERSION = 2) PEA
  ON PEA.CATEGORY LIKE '%'''+CAT_CODE+'''%'