如何在SQl Server中编写此Conditional where子句?

时间:2016-01-11 10:25:20

标签: sql sql-server

您好我有以下类型的查询:

Select a,b from tab1 whre tab1.id in 
 (Select id from tab2 where x=1 and y=2 and  z>getdate())

现在z是tab2中的日期时间列,它是可以为空的列。所以我想要检查z> getdate()仅当它不为null时。 已检查Conditional WHERE clause in SQL Server但无法准确执行。基本上我不希望'z'列检查上面的查询,如果它在tab2中为null。

提前致谢。

2 个答案:

答案 0 :(得分:2)

你的意思是:

Select a,b from tab1 where tab1.id in 
 (Select id from tab2 where x=1 and y=2 and  (z is null or (z is not null and z>getdate())))

答案 1 :(得分:1)

我认为您需要ANDOR运算符的组合。组合这些时,您需要了解operator precedence。在我的例子中,我使用括号来确保一起检查x,y和z,然后分别重新检查z。查询返回检查块1或2为真的任何记录。

在我的示例中,我使用了JOIN,但您可以将相同的技术应用于原始子查询。

实施例

SELECT
    t1.a,
    t1.b
FROM
    Tab1 AS t1
        INNER JOIN Tab2 AS t2            ON t1.Id = t2.Id
WHERE
    (
        -- Check block 1.
        t2.x = 1
        AND t2.y = 1
        AND t2.z > GETDATE()                
    )
    -- Check block 2.
    OR z IS NULL
;

编辑:我不完全确定我理解这个问题。如果你能提供一些样本记录和预期的输出,那将有所帮助。