具有多个OR的SQL查询

时间:2014-03-07 23:24:13

标签: sql

我有一个类似的查询:

SELECT * 
    FROM myDB.Table
        WHERE KEY='a' OR
        WHERE KEY='b' OR
        WHERE KEY='c' OR ...

我需要在表中大约150个表行完成大约500,000。有更好/更快的方法吗?

2 个答案:

答案 0 :(得分:9)

SELECT * FROM myDB.Table WHERE KEY IN ('a', 'b', 'c', etc...)

IN运算符允许您在WHERE子句中指定多个值。

答案 1 :(得分:2)

如果您需要在IN语句中包含150个值,则编写用户定义的函数可能更有效,该函数将以逗号分隔的连接值列表,并将其返回为表变量,然后可以直接在查询中加入。

以下是从此网站http://www.sql-server-helper.com/functions/comma-delimited-to-table.aspx获取的示例(尽管还有很多其他网站):

CREATE FUNCTION [dbo].[ufn_CSVToTable] ( @StringInput NVARCHAR(8000) )
RETURNS @OutputTable TABLE ( [String] NVARCHAR(10) )
AS
BEGIN

    DECLARE @String    NVARCHAR(10)

    WHILE LEN(@StringInput) > 0
    BEGIN
        SET @String      = LEFT(@StringInput, 
                                ISNULL(NULLIF(CHARINDEX(',', @StringInput) - 1, -1),
                                LEN(@StringInput)))
        SET @StringInput = SUBSTRING(@StringInput,
                                     ISNULL(NULLIF(CHARINDEX(',', @StringInput), 0),
                                     LEN(@StringInput)) + 1, LEN(@StringInput))

        INSERT INTO @OutputTable ( [String] )
        VALUES ( @String )
    END

    RETURN
END
GO
  • 更改输出密钥类型(NVARCHAR(10))和@String以匹配您的密钥数据类型。

然后你就像这样加入这张桌子:

SELECT MyTable.*
FROM [myDB].[Table] MyTable 
INNER JOIN [myDB].[ufn_CSVToTable] ( 'a,b,c' ) KeyFilter
  ON MyTable.[KEY] = KeyFilter.[String]