【问题标题】:TSQL Option Where with CASE StatementTSQL 选项 Where 与 CASE 语句
【发布时间】:2015-08-07 03:00:19
【问题描述】:

我有一个基本查询,用于根据在 UI 上选择的过滤器选项获取搜索结果。

在我的表中,我有一个名为 expirationDate 的日期列,它是文档过期的日期(不做任何事情,仅供参考)。

好吧,在 UI 中,有一个选项可以选择您想要查看的状态;已过期或有效。

根据您选择的查询,我需要更改查询,但不确定如何进行,因为它与日期有关,而不仅仅是它必须检查的状态列。

在下面的查询中,如果 status = Active,我需要添加到 WHERE 子句,以便 expireDate 没有超过今天的日期(意味着它还没有过期)。但是,如果我选择过期,我需要 WHERE 子句包含过期日期尚未超过今天日期的任何内容(活动项目)。

IF(@employee = '') SET @employee = NULL;
IF(@supervisor = '') SET @supervisor = NULL;
IF(@manager = '') SET @manager = NULL;
IF(@location = '') SET @location = NULL;
IF(@skillset = '') SET @skillset = NULL;
IF(@category = '') SET @category = NULL;
IF(@type = '') SET @type = NULL;
IF(@status = '') SET @status = NULL;

    SELECT recordID,
           employeeQID,
           firstName,
           lastName,
           department,
           location,
           supervisorQID,
           supervisorFirstName,
           supervisorLastName,
           managerQID,
           managerFirstName,
           managerLastName,
           documentationType,
           documentationCategory,
           CONVERT(VARCHAR(10), startDate, 101) AS startDate,
           CONVERT(VARCHAR(10), expirationDate, 101) AS expirationDate,
           notes,
           skillset,
           timestamp,
           creator
    FROM   dbo.documentation_records
    WHERE  (@employee IS NULL OR (employeeQID = @employee))
    AND    (@supervisor IS NULL OR (supervisorQID = @supervisor))
    AND    (@manager IS NULL OR (managerQID = @manager))
    AND    (@location IS NULL OR (location = @location))
    AND    (@skillset IS NULL OR (skillset = @skillset))
    AND    (@category IS NULL OR (documentationCategory = @category))
    AND    (@type IS NULL OR (documentationType = @type))
    FOR    XML PATH ('results'), TYPE, ELEMENTS, ROOT ('root');

处理此问题的最佳方法是什么,同时还允许状态为 NULL,如果没有像我对其他 vars 所做的那样在 UI 中选择作为过滤器选项,则将其忽略。

【问题讨论】:

标签: sql-server sql-server-2008 tsql stored-procedures


【解决方案1】:
        ((@status = '' 
     OR  @status IS NOT NULL && @STATUS = 'ACTIVE' AND EXPIRATIONDATE > GETDATE() )
     OR (@status IS NOT NULL && @STATUS = 'expired' AND EXPIRATIONDATE < GETDATE()))

以上是添加到您的 where 子句的代码。它会这样做。

**编辑** 如果未传入状态,则第一个 or 子句将返回所有内容。

|| 将带您到达那里。您想要所有不为 NULL、处于活动状态且未过期 OR 的所有内容均不为 NULL、已过期且已过期。

IF(@employee = '') SET @employee = NULL;
IF(@supervisor = '') SET @supervisor = NULL;
IF(@manager = '') SET @manager = NULL;
IF(@location = '') SET @location = NULL;
IF(@skillset = '') SET @skillset = NULL;
IF(@category = '') SET @category = NULL;
IF(@type = '') SET @type = NULL;
IF(@status = '') SET @status = NULL;

    SELECT recordID,
           employeeQID,
           firstName,
           lastName,
           department,
           location,
           supervisorQID,
           supervisorFirstName,
           supervisorLastName,
           managerQID,
           managerFirstName,
           managerLastName,
           documentationType,
           documentationCategory,
           CONVERT(VARCHAR(10), startDate, 101) AS startDate,
           CONVERT(VARCHAR(10), expirationDate, 101) AS expirationDate,
           notes,
           skillset,
           timestamp,
           creator
    FROM   dbo.documentation_records
    WHERE  (@employee IS NULL OR (employeeQID = @employee))
    AND    (@supervisor IS NULL OR (supervisorQID = @supervisor))
    AND    (@manager IS NULL OR (managerQID = @manager))
    AND    (@location IS NULL OR (location = @location))
    AND    (@skillset IS NULL OR (skillset = @skillset))
    AND    (@category IS NULL OR (documentationCategory = @category))
    AND    (@type IS NULL OR (documentationType = @type))
    AND    (
                    (@status = ''
 OR @status IS NOT NULL AND @STATUS = 'ACTIVE' AND EXPIRATIONDATE > GETDATE() )
                 OR (@status IS NOT NULL AND @STATUS = 'expired' AND EXPIRATIONDATE < GETDATE())
                )
        FOR    XML PATH ('results'), TYPE, ELEMENTS, ROOT ('root');

【讨论】:

  • 这适用于一个例外.. 它需要一个状态才能运行。如果我没有在状态中传递任何东西(它在 UI 中是可选的),那么什么都不会返回。在某些情况下,我不在乎状态是什么,我只想查看员工 Jim Bob 的一切。
  • 添加了一个附加的 or 子句来确保如果状态为空则返回所有内容
  • 什么时候可以在sql server 表达式中使用|
  • @m.Ali 哦 ffs,如果你没有足够的能力替换||与或。不要编程。您的评论和可能的反对意见也是愚蠢的,因为 |自 sql 2005 msdn.microsoft.com/en-us/library/ms186714.aspx 起可用作按位 OR
  • 所有这些 NOT、And 和 OR 都放在一起,没有任何括号,您能否解释一下哪个谓词优先于什么? @status = '' OR @status IS NOT NULL AND @STATUS = 'ACTIVE' AND EXPIRATIONDATE &gt; GETDATE()
猜你喜欢
  • 1970-01-01
  • 2012-12-23
  • 2013-08-15
  • 2013-03-23
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多