SQL条件WHERE使用IN

时间:2014-03-14 09:59:43

标签: sql sql-server

我很难弄清楚这种语法的正确性,也无法弄清楚如何正确地写这个。

我有一些包含一些连接的存储过程,而where子句是这样的:

WHERE
    [Column1] = (SELECT Source FROM @CurrentTransition) AND
    [Column2] = (SELECT Target FROM @CurrentTransition) AND
    [IsDeprecated] = 0 AND
    sbl.StratId is null AND
    std.StratId is null AND
    CASE WHEN s.StratTimeBiasId <> NULL THEN s.StratTimeBiasId IN (SELECT * FROM dbo.fnGetValidTimeBiases(CAST(@datetime AS TIME)))

错误只是Incorrect syntax near the keyword 'IN'.

fnGetValidTimeBiases函数只返回Id作为外键的表中的StratTimeBiasId值列表。

我只希望在StratTimeBiasId列中实际存在值时使用该特定联接。

3 个答案:

答案 0 :(得分:1)

这不是CASE声明的用途。请改用简单的布尔逻辑:

AND (s.StratTimeBiasId IS NULL OR s.StartTimeBiasId IS NOT NULL AND s.StratTimeBiasId IN (SELECT * FROM dbo.fnGetValidTimeBiases(CAST(@datetime AS TIME))))

以上将匹配s.StratTimeBiasId具有NULL值或其值在该函数结果中的任何内容(我假设该函数仅返回单个列?如果不是,那将去抛出错误)。

相关说明:=<>在处理NULL时不是正确的运算符。如果您想测试列的值是否为(非)null,则需要使用column IS (NOT) NULL

答案 1 :(得分:0)

试试这个:

WHERE
    [Column1] = (SELECT Source FROM @CurrentTransition) AND
    [Column2] = (SELECT Target FROM @CurrentTransition) AND
    [IsDeprecated] = 0 AND
    sbl.StratId is null AND
    std.StratId is null AND
    s.StratTimeBiasId IS NULL OR s.StratTimeBiasId IN (dbo.fnGetValidTimeBiases(CAST(@datetime AS TIME)))

答案 2 :(得分:0)

你可能已经想到了......

WHERE
[Column1] = (SELECT Source FROM @CurrentTransition) AND
[Column2] = (SELECT Target FROM @CurrentTransition) AND
[IsDeprecated] = 0 AND
sbl.StratId is null AND
std.StratId is null AND
s.StratTimeBiasId IN (SELECT * FROM dbo.fnGetValidTimeBiases(CAST(@datetime AS TIME)))