在where子句中使用if else时出错

时间:2014-04-23 12:50:02

标签: sql-server

我将两个变量(例如SDateEDate)传递给存储过程,我想要从VDAte SDateEDate之类的表中选择数据SDateEDate都不为空。如果EDate为空,那么我想选择VDAte = SDAte的数据。我尝试使用{{1在where子句中有{}}和If..Else,但它给出了不正确的syntx错误。 查询:

Case

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:3)

稍微调整一下名字,

SELECT Column1, Column2
 from MyTable
 where VDate between @SDate and isnull(@EDate, @SDate)

应该这样做。

答案 1 :(得分:0)

我认为您可以尝试以下查询:

SELECT
    Column1,
    Column2

FROM
    Table t

WHERE
    t.VDate IN (
        SELECT
            VDate

        FROM
            Table

        WHERE
            VDate BETWEEN SDate AND EDate
        AND
            EDate is not null
    )
OR
    (
        t.VDate = SDate
    AND
        EDate is null
    )

如果EDate不为空,则t.VDate介于SDateEDate之间,否则为t.VDate = SDate

答案 2 :(得分:0)

问题在于你不能以这种方式在where子句中使用IF。

因此,如果您比较的数据取决于EDate值,您可以这样做:

SELECT Column1 ,column2
from Table t
WHERE
    (t.EDate IS NOT NULL AND t.VDate IN (SELECT VDate FROM Table where VDate BETWEEN SDate AND EDate))
    OR (t.EDate IS NULL AND t.VDate IN (SELECT SDate FROM Table))

如果EDate不为null,则查询选择介于两者之间的VDates。如果为null,则为另一个。

答案 3 :(得分:0)

试试这个:

SELECT Column1, Column2
 from MyTable
 where (VDate between @SDate and @EDate and (@SDate+@EDate is not null)) or (VDate = @Sdate and @Edate is null)

@Philip Kelley的答案也是一个很好的方法