使用用例语句更新表格

3
UPDATE crm_accounts 
SET 
    reg = "Sim" 
WHERE age >= 17 
AND age <= 35 
AND balance > 0.00
AND type = "Júnior";


UPDATE crm_accounts 
SET 
    reg = "Não" 
WHERE age >= 17 
AND age <= 35 
AND balance = 0.00
AND type = "Júnior";


UPDATE crm_accounts 
SET 
    type = "Efetivo"
WHERE age >= 17
AND age <= 35 
AND type = "Júnior";

这个语句可以达到目的,但我想简化并将其合并在一个case语句中。能帮忙吗?谢谢。


1
你尝试了什么?一些阅读材料:https://dev59.com/0XDXa4cB1Zd3GeqP_l8f#15745186 - user180100
2个回答

2
看起来你想要这样的东西:
 UPDATE crm_accounts a
    SET a.reg 
      = CASE
          WHEN a.balance > 0.00 THEN 'Sim'
          WHEN a.balance = 0.00 THEN 'Não'
          ELSE a.reg
        END
      , a.type = 'Efetivo'
  WHERE a.age >= 17
    AND a.age <= 35
    AND a.type = 'Júnior'

每当我编写这样的更新语句时,我总是先在SELECT语句中测试表达式和谓词,并验证结果。在将其转换为UPDATE语句之前,我确保一切都按照我的需求工作。

 SELECT a.age >= 17
      , a.type
      , a.reg AS old_reg
      , CASE
          WHEN a.balance > 0.00 THEN 'Sim'
          WHEN a.balance = 0.00 THEN 'Não'
          ELSE a.reg
        END AS new_reg
   FROM crm_accounts a
  WHERE a.age >= 17
    AND a.age <= 35
    AND a.type = 'Júnior'

一切正常。感谢@spencer7593的一切。 - jmsf
1
注意:我建议您使用单引号而不是双引号来括起字符串字面量。是的,MySQL确实允许用双引号括起字符串字面量。但其他数据库不允许。而且在MySQL中,如果更改sql_mode以包括ANSI_QUOTES,那么MySQL将解释双引号来括起标识符(例如列名),而不是字符串字面量。单引号是标准的,并且可以与任何sql_mode设置一起使用。使用双引号括起字符串字面量的潜在风险超过了任何潜在好处。 - spencer7593
你是对的...我已经遇到双引号的问题了,但我总是忘记... - jmsf

0

MYSQL中的CASE语句

CASE语句有两种语法形式

语法形式1:

CASE case_value
    WHEN when_value THEN statement_list
    [WHEN when_value THEN statement_list] ...
    [ELSE statement_list]
END CASE

语法 2:

CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE

语法一的解释:

对于第一种语法,case_value 是一个表达式。将该值与每个 WHEN 子句中的 when_value 表达式进行比较,直到找到相等的为止。当找到相等的 when_value 时,执行相应的 THEN 子句 statement_list。如果没有相等的 when_value,则执行 ELSE 子句 statement_list(如果有)。

此语法不能用于测试与 NULL 的相等性,因为 NULL = NULL 是 false。

语法二的解释:

对于第二种语法,将评估每个 WHEN 子句 search_condition 表达式,直到其中一个为 true,此时将执行其相应的 THEN 子句 statement_list。如果没有匹配的 search_condition,则执行 ELSE 子句 statement_list(如果有)。

如果没有 when_value 或 search_condition 与测试的值匹配,并且 CASE 语句不包含 ELSE 子句,则会导致“CASE 语句未找到”错误。

每个 statement_list 包含一个或多个 SQL 语句;不允许为空的 statement_list。

要处理任何 WHEN 子句都没有匹配的情况,请使用包含空 BEGIN ... END 块的 ELSE,如本示例所示。(此处在 ELSE 子句中使用的缩进仅用于清晰起见,否则没有其他意义。)

DELIMITER |

CREATE PROCEDURE p()
  BEGIN
    DECLARE v INT DEFAULT 1;

    CASE v
      WHEN 2 THEN SELECT v;
      WHEN 3 THEN SELECT 0;
      ELSE            
        END;
    END CASE;
  END;
  |

您可以使用 CASE 语句更新您的代码,就像这样...

UPDATE `crm_accounts` SET `reg` = CASE

WHEN age >= 17 
AND age <= 35 
AND balance > 0.00
AND type = "Júnior" THEN "Sim"

WHEN age >= 17 
AND age <= 35 
AND balance = 0.00
AND type = "Júnior" THEN "Não"

WHEN age >= 17
AND age <= 35 
AND type = "Júnior" THEN "Efetivo"

ELSE `reg`

END

2
不确定您在语法二中获取ELSE子句的信息来源,但它是不准确的。 省略ELSE子句仅意味着如果未满足任何when条件,则CASE“返回”null; 并且在查询中使用CASE时,我相当确定仅包含BEGIN和END(不终止整个CASE)会导致问题。也许您混淆了用于查询的CASE WHEN condition和用于过程逻辑的CASE? - Uueerdo
@Uueerdo。我只从mysql.com上获取了这些信息,并且我已经在我的一个项目中使用了这个else部分... - Naresh Kumar P
1
@NareshKumar.P 你在查询中使用过 CASE .... ELSE BEGIN ... 吗? - Uueerdo
@Uueerdo。我已经从CASE语句的ELSE部分中删除了BEGIN。现在这个是正确的吗? - Naresh Kumar P
这是不正确的CASE是MySQL和许多其他关系型数据库支持的标准SQL表达式。我们应该注意不要混淆SQL标准的CASE表达式CASE语句,它们是完全不同的东西。这个答案倾泻了关于CASE语句的文档/解释,并演示了在MySQL存储程序中使用CASE语句的方法,然后(错误地)建议可以在UPDATE语句中使用CASE语句那是错误的CASE表达式可以在UPDATE语句中使用。 - spencer7593
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接