【问题标题】:Is it possible to use AND in an UPDATE SET clause in a CASE statement?是否可以在 CASE 语句的 UPDATE SET 子句中使用 AND?
【发布时间】:2019-11-25 16:53:19
【问题描述】:

我需要检查两个条件: 1.当函数返回true时 2. 当函数返回 true 并且 ISP_Program 中包含单词“IRSS”时 什么是正确的语法?我有以下内容:

UPDATE [PAYROLL].[dbo].[BILL]
SET Pay_Code = CASE dbo.is_Holiday([BILL].Date)
                    WHEN 1 THEN holiday_code
                    WHEN 1 AND ISP_Program like '%IRSS%' THEN '66'
                    ELSE Pay_Code
                END 
FROM tbl_TXEX_HOLIDAY
INNER JOIN [BILL] ON [BILL].Pay_Code = tbl_HOLIDAY.regular_code

【问题讨论】:

  • 您的第二个条件是第一个条件的子集。样本数据和所需结果可能会阐明您想要什么。另外,标记您正在使用的数据库。
  • 您尝试混合使用 simple casesearched case 表达式。 documentation 解释了条件的差异。而'1' 不是适合与and 一起使用的boolean data type 值。

标签: sql sql-server tsql sql-update


【解决方案1】:

我想你想要:

SET Pay_Code = (CASE WHEN dbo.is_Holiday([BILL].Date) = 1 AND ISP_Program like '%IRSS%' THEN '66'
                    WHEN dbo.is_Holiday([BILL].Date) = 1 THEN holiday_code
                    ELSE Pay_Code
                END) 

请注意,这些条件的顺序很重要。

我假设BILLUPDATE 中引用的表。我建议将完整的逻辑写成:

UPDATE b
    SET Pay_Code = (CASE WHEN dbo.is_Holiday(b.Date) = 1 AND ISP_Program like '%IRSS%' THEN '66'
                         WHEN dbo.is_Holiday(b.Date) = 1 THEN holiday_code
                         ELSE b.Pay_Code
                    END)  
    FROM [PAYROLL].[dbo].[BILL] b JOIN
         tbl_TXEX_HOLIDAY h
         ON b.Pay_Code = h.regular_code;

注意事项:

  • 为表定义别名,以便查询更易于编写和阅读。
  • 使用alias 进行更新,以便清楚您的意图。
  • 将要更新的表放在首位。毕竟,update 需要有匹配的行才能发生。
  • 当然,修复case 表达式。

【讨论】:

  • 您假设 BILL 表是 UPDATE 中引用的表是正确的。我将继续制作别名并更改查询以将要更新的表放在第一位并修复 CASE 语句。谢谢!
猜你喜欢
  • 2017-06-10
  • 2017-01-16
  • 2021-04-02
  • 2017-05-07
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多