【问题标题】:Conditional WHERE clause for fetching records用于获取记录的条件 WHERE 子句
【发布时间】:2014-03-06 05:46:51
【问题描述】:

我正在使用 SQL Server 2008 R2。

我有一个如下的 SQL 块:

DECLARE @Day INT = 5
DECLARE @Month INT = NULL
DECLARE @year INT = NULL
DECLARE @dtnow DATETIME

SET @dtnow = GETDATE()

IF @Month IS NULL
    SELECT @Month = MONTH(DATEADD(MONTH,-1, @dtnow ))

IF @Year IS NULL
    SELECT @year = YEAR(DATEADD(MONTH,-1, @dtnow ))


SELECT * 
FROM TblSalesRecords 
WHERE 
    CASE WHEN @Day IS NULL THEN -- Condition One
        BEGIN 
            ISNULL(@Month, MONTH(TblSalesRecords.CreatedDate)) = MONTH(TblSalesRecords.CreatedDate) 
            AND (@year, YEAR(TblSalesRecords.CreatedDate)) = YEAR(TblSalesRecords.CreatedDate)
        END 
    ELSE                        -- Condition two
        BEGIN 
            TblSalesRecords.CreatedDate BETWEEN CONVERT(DATETIME, CONVERT(VARCHAR,YEAR(DATEADD(MONTH,-1, @dtnow ))) + '-' + CONVERT(VARCHAR,month(DATEADD(MONTH,-1,@dtnow))) + '-' + CONVERT(VARCHAR, DAY(DATEADD(MONTH,-1,@dtnow))) +' 00:00:00.000') 
            AND CONVERT (DATETIME, CONVERT(VARCHAR,YEAR(DATEADD(DAY,-1,@dtnow ))) + '-' + CONVERT(VARCHAR,MONTH(DATEADD(DAY,-1,@dtnow))) + '-' + CONVERT(VARCHAR, DAY(DATEADD(DAY,-1,@dtnow))) +' 23:59:59.998')
        END
    END 
    AND TblSalesRecords.IsDeleted=0

我想要实现的是,

如果@Day设置为NULL,那么它应该执行CASE..WHEN语句--条件一 else --条件二

但在CASE..WHEN 语句中,"=" 附近出现语法错误。

谁能告诉我如何做到这一点?

【问题讨论】:

    标签: sql sql-server sql-server-2008 sql-server-2005 sql-server-2008-r2


    【解决方案1】:

    你可以这样实现:

    SELECT * 
    FROM TblSalesRecords 
    WHERE (@Day IS NULL 
                AND ISNULL(@Month, MONTH(TblSalesRecords.CreatedDate)) = MONTH(TblSalesRecords.CreatedDate) 
                AND (@year, YEAR(TblSalesRecords.CreatedDate)) = YEAR(TblSalesRecords.CreatedDate)
           )
        OR (@Day IS NOT NULL                      -- Condition two
                AND TblSalesRecords.CreatedDate BETWEEN CONVERT(DATETIME, CONVERT(VARCHAR,YEAR(DATEADD(MONTH,-1, @dtnow ))) + '-' + CONVERT(VARCHAR,month(DATEADD(MONTH,-1,@dtnow))) + '-' + CONVERT(VARCHAR, DAY(DATEADD(MONTH,-1,@dtnow))) +' 00:00:00.000') 
                AND CONVERT (DATETIME, CONVERT(VARCHAR,YEAR(DATEADD(DAY,-1,@dtnow ))) + '-' + CONVERT(VARCHAR,MONTH(DATEADD(DAY,-1,@dtnow))) + '-' + CONVERT(VARCHAR, DAY(DATEADD(DAY,-1,@dtnow))) +' 23:59:59.998')
            )
        AND TblSalesRecords.IsDeleted=0
    

    (@year, YEAR(TblSalesRecords.CreatedDate)) = YEAR(TblSalesRecords.CreatedDate) 中还有另一个语法错误,但我不确定应该是什么,所以我保持原样。

    【讨论】:

    • 谢谢 Syzmon。让我检查一下。
    • 不工作。在这种情况下,条件 1 和条件 2 都在获取记录。
    • 在这种情况下@Day 是否为空?不看数据很难给你一个明确的答案。
    • 天设置为空。声明 @Day INT = NULL。
    • 确切的情况是,当我将 Day 设置为 NULL 时,我将获取上个月的所有记录。这就是我设置 SELECT Month = MONTH(DATEADD(MONTH,-1, dtnow )) 的原因,其中“dtnow”是当前日期。如果 Day 不为空,那么我想获取从上个月的一天开始到比本月的一天少一天的记录。
    猜你喜欢
    • 2014-03-09
    • 2013-05-05
    • 1970-01-01
    • 2015-05-18
    • 2018-08-06
    • 2018-08-07
    • 2021-03-10
    • 2019-06-03
    • 1970-01-01
    相关资源
    最近更新 更多