CASE无法按预期工作 - Transact SQL

时间:2017-12-28 16:18:23

标签: sql sql-server case

下面的第一个案例组(Err1)不会超出第一个案例组。除非我删除其他两个案例组,Err2和Err3,否则它会按预期工作。我最初将这些连接起来创建了一个列,但它的工作原理如上所述。我认为将它分成不同的列可以解决我的问题,但没有快乐。

SELECT 
    *, 
    CASE
       WHEN ISNULL(Approval_Date, 0) = 0 
          THEN 'Approval Date is Missing' + Char(13) + Char(13) 
          ELSE
             CASE WHEN First_Spend > (ISNULL(Approval_Date, 0) + 15)  
                     THEN 'Approval Date is too far in the past' + char(13) + Char(13) 
                  WHEN (First_Spend + 25) < ISNULL(Approval_Date, 0)  
                     THEN 'Approval Date is too far in the future' + char(13) + Char(13) 
             END
    END AS 'ERR1',
    CASE
       WHEN Funding_Status = '' 
          THEN 'Funding Status is Missing' + Char(13) + Char(13) 
    END AS 'ERR2',
    CASE
       WHEN Funding_Type = '' 
          THEN 'Funding Type is Missing' + Char(13) + Char(13) 
    END AS 'ERR3'

我尝试了几种不同的版本,但效果仍然不正确。任何聪明的想法都会受到赞赏。

由于

3 个答案:

答案 0 :(得分:1)

您的日期似乎没有被定义为日期,如果您知道这一点,请原谅我,但空字符串与null不同。

下面的示例显示了我认为您想要做的事情,但使用了适当的数据类型。我强烈建议使用适当的数据类型。

并且,为了消除任何误解,只要案例陈述中的一个条件为真,就不会出现以下情况&#34;当&#34;条款被评估。 err1,err2和err3是独立的case语句,所以它们应该总是被评估,但是嵌套的case语句依赖于err1。

此外,char(13)是回车。这将导致您的输出行被覆盖。也许您希望char(10)是换行符(或者如果您在Windows上运行则两者都是。)

$(document).ready(function () {
  $('.valid').on('change', function () {
    if ($(this.options[this.selectedIndex]).attr('quantity') == 0) {
       $(this.options[this.selectedIndex]).find('span').remove();
       $(this.options[this.selectedIndex]).append('<span>Message</span>')
    }
  });
});

答案 1 :(得分:0)

试试这个:

SELECT  *, 
        CASE
            WHEN ISNULL(Approval_Date, 0) = 0 THEN 'Approval Date is Missing' + Char(13) + Char(13) 

            WHEN First_Spend > (ISNULL(Approval_Date, 0) + 15) THEN 'Approval Date is too far in the past' + char(13) + Char(13) 

            WHEN (First_Spend + 25) < ISNULL(Approval_Date, 0) THEN 'Approval Date is too far in the future' + char(13) + Char(13) 
        END AS 'ERR1',
        CASE
            WHEN Funding_Status = '' THEN 'Funding Status is Missing' + Char(13) + Char(13) 
        END AS 'ERR2',
        CASE
            WHEN Funding_Type = '' THEN 'Funding Type is Missing' + Char(13) + Char(13) 
        END AS 'ERR3'

答案 2 :(得分:0)

谢谢你们,你们都在正确的轨道上。最大的问题是一些案件返回null。原始版本实际上有效,但它返回了一个错误,因为“批准日期缺失”#39;和批准日期过去太远&#39;,这可能是同样的错误。

我做了一些更改,我添加了Elses,我使用我的isnull值进行审批日期以消除重复错误,并修复了丢失First_Spend日期的可能性。它现在看起来像这样:

SELECT *, 
Case When Approval_Date is null then 'Approval Date is Missing' + Char(13) + Char(13) Else ''End +
Case When Funding_Status = '' then 'Funding Status is Missing' + Char(13) + Char(13) Else '' End +
Case When Funding_Type = '' then 'Funding Type is Missing' + Char(13) + Char(13) Else '' End +

Case 
    When ISNULL(First_Spend,0) >(isnull(Approval_Date,CAST('12/12/2099' AS DATETIME)) + 15)  then 'Approval Date is too far in the past' + char(13) + Char(13) 
    When (ISNULL(First_Spend,CAST('12/12/2099' AS DATETIME)) +25) < isnull(Approval_Date,0)  then 'Approval Date is too far in the future' + char(13) + Char(13)
    Else '' End as 'ERR'