想要将 4 个不同的列与 CTE 的结果进行比较

Want to compare 4 different columns with the result of CTE

我创建了一个 CTE(常用 table 表达式)如下:

DECLARE @N VARCHAR(100)

WITH CAT_NAM AS (    
    SELECT ID, NAME
    FROM TABLE1    
    WHERE YEAR(DATE) = YEAR(GETDATE())    
)    
SELECT @N = STUFF((
    SELECT ','''+ NAME+''''    
    FROM CAT_NAM    
    WHERE ID IN (20,23,25,30,37)   
    FOR XML PATH ('')    
),1,1,'')

以上CTE的结果是'A','B','C','D','F'

现在我需要检查 CTE 结果中的 4 个不同的列 CAT_NAM_1、CAT_NAM_2、CAT_NAM_3、CAT_NAM_4 并将其形成为一列,如下所示:

Select 
case when CAT_NAM_1 in (@N) then CAT_NAM_1
     when CAT_NAM_2 in (@N) then CAT_NAM_2
     when CAT_NAM_3 in (@N) then CAT_NAM_3
     when CAT_NAM_4 in (@N) then CAT_NAM_4
end as CAT
from table2

当我尝试执行上述操作时出现错误,请帮助我执行此操作。 如果我的方法有误,请帮助我改正。

我不太确定您要做什么,但如果我理解以下脚本,则显示了一种可能的技术。我创建了一些 table 变量来模拟您提供的数据,然后写了一个 SELECT 语句来执行我认为您要求的操作(但我不确定)。

DECLARE @TABLE1 AS TABLE (
    ID INT NOT NULL, 
    [NAME] VARCHAR(10) NOT NULL, 
    [DATE] DATE NOT NULL
);

INSERT INTO @TABLE1(ID,[NAME],[DATE])
VALUES (20, 'A', '2021-01-01'), (23, 'B', '2021-02-01'),
(25, 'C', '2021-03-01'),(30, 'D', '2021-04-01'),
(37, 'E', '2021-05-01'),(40, 'F', '2021-06-01');

DECLARE @TABLE2 AS TABLE (
    ID INT NOT NULL, 
    CAT_NAM_1 VARCHAR(10) NULL, 
    CAT_NAM_2 VARCHAR(10) NULL, 
    CAT_NAM_3 VARCHAR(10) NULL, 
    CAT_NAM_4 VARCHAR(10) NULL
);

INSERT INTO @TABLE2(ID,CAT_NAM_1,CAT_NAM_2,CAT_NAM_3,CAT_NAM_4)
VALUES (1,'A',NULL,NULL,NULL),(2,NULL,'B',NULL,NULL);

;WITH CAT_NAM AS (
    SELECT ID, [NAME]
    FROM @TABLE1 
    WHERE YEAR([DATE]) = YEAR(GETDATE()) 
    AND ID IN (20,23,25,30,37,40)
)
SELECT CASE 
    WHEN EXISTS(SELECT 1 FROM CAT_NAM WHERE CAT_NAM.[NAME] = CAT_NAM_1) THEN CAT_NAM_1 
    WHEN EXISTS(SELECT 1 FROM CAT_NAM WHERE CAT_NAM.[NAME] = CAT_NAM_2) THEN CAT_NAM_2
    WHEN EXISTS(SELECT 1 FROM CAT_NAM WHERE CAT_NAM.[NAME] = CAT_NAM_3) THEN CAT_NAM_3
    WHEN EXISTS(SELECT 1 FROM CAT_NAM WHERE CAT_NAM.[NAME] = CAT_NAM_4) THEN CAT_NAM_4 
    ELSE '?' -- not sure what you want if there is no match
END AS CAT
FROM @TABLE2;

你可以为此做一些基于集合的逻辑

SELECT
    ct.NAME
FROM table2 t2
CROSS APPLY (
    SELECT v.NAME
      FROM (VALUES
        (t2.CAT_NAM_1),
        (t2.CAT_NAM_2),
        (t2.CAT_NAM_3),
        (t2.CAT_NAM_4)
      ) v(NAME)
    INTERSECT
    SELECT ct.NAM
      FROM CAT_NAM ct
      WHERE ct.ID IN (20,23,25,30,37)
) ct;