SQL IN子句有多个列和多个值

时间:2017-05-02 22:10:42

标签: sql-server tsql

此查询很好。

SELECT * FROM TABLE WHERE 330110042 IN (iItem01,iItem02,iItem03,iItem04,iItem05,iItem_1,iItem_2,iItem_3,iItem_4,iItem_5,iItem_6,iItem_7,iItem_8,iItem_9,iItem_10,iItem_11,iItem_12,iItem_13,iItem_14,iItem_15,iItem_16,iItem_17,iItem_18,iItem_19,iItem_20,iItem_21,iItem_22,iItem_23,iItem_24,iItem_25,iItem_26,iItem_27,iItem_28,iItem_29,iItem_30)

但是这个查询没有用。

SELECT * FROM TABLE WHERE 330110042, 330110002, 330110002  IN (iItem01,iItem02,iItem03,iItem04,iItem05,iItem_1,iItem_2,iItem_3,iItem_4,iItem_5,iItem_6,iItem_7,iItem_8,iItem_9,iItem_10,iItem_11,iItem_12,iItem_13,iItem_14,iItem_15,iItem_16,iItem_17,iItem_18,iItem_19,iItem_20,iItem_21,iItem_22,iItem_23,iItem_24,iItem_25,iItem_26,iItem_27,iItem_28,iItem_29,iItem_30)

我如何在SQL Server中工作?

1 个答案:

答案 0 :(得分:1)

这里很难说出你的确切目标,但有一种可能性就是将值列表转换为自己的表结构。公用表表达式可能有效:

;WITH Ids AS
(
    SELECT 330110042 AS Id
    UNION ALL
    SELECT 330110002
)
SELECT t.*
FROM   [Table] t
INNER JOIN Ids i ON t.iItem01 = i.Id OR t.iItem02 = i.Id OR...

但是,使用UNPIVOT的解决方案可能会更优雅。我假设您的表有一个名为Id的主键列:

;WITH Unpivoted AS
(
    SELECT Id, ColName, ColValue
    FROM   (SELECT Id, iItem01, iItem02, iItem03
            FROM   [Table] t) p
    UNPIVOT
    (ColValue FOR ColName IN (iItem01, iItem02, iItem03)) AS unpvt
)
SELECT t.*
FROM   [Table] t
WHERE  EXISTS (SELECT 1 FROM Unpivoted u
               WHERE  t.Id = u.Id
               AND    u.ColValue IN (330110042, 330110002))

当然,您将添加所有必要的列。我在这个例子中只添加了前三个。