【问题标题】:MySQL UPDATE -- ignore records not in CASE statementMySQL UPDATE - 忽略不在 CASE 语句中的记录
【发布时间】:2019-11-14 15:39:19
【问题描述】:

在使用 CASE/WHEN/THEN 时如何忽略不在 case 语句中的记录?

例如,此语句将按预期更新三个匹配的记录,但会将不匹配 WHEN/THEN 子句的所有学生记录设为 NULL

UPDATE table SET student = (CASE WHEN student = '10' THEN '100412'
                                 WHEN student = '17' THEN '100295' 
                                 WHEN student = '26' THEN '100981'
                            END)
WHERE year = '2019';

如何跳过不在 CASE 语句中的记录而只更改具有匹配子句的记录?

【问题讨论】:

  • 试试column 不为空

标签: mysql sql mariadb


【解决方案1】:

对于不在case语句中跳过记录,你可以使用类似这样的东西

UPDATE table SET student = (CASE WHEN student = '10' THEN '100412'
                                 WHEN student = '17' THEN '100295' 
                                 WHEN student = '26' THEN '100981'
                            END)
WHERE year = '2019' AND student IN ('10','17','26');

【讨论】:

    【解决方案2】:

    您可以为此使用默认情况:

    UPDATE table SET student = (CASE WHEN student = '10' THEN '100412'
                                     WHEN student = '17' THEN '100295' 
                                     WHEN student = '26' THEN '100981'
                                     ELSE student
                                END)
    WHERE year = '2019';
    

    否则,如果您想最小化负载,只需将所有已知的student 值添加到WHERE 子句。这只会在那些真正受更改影响的行上触发更新

    【讨论】:

      【解决方案3】:

      我认为有两种解决方案:

      1. 添加 where 子句
      UPDATE table SET student = (CASE WHEN student = '10' THEN '100412'
                                       WHEN student = '17' THEN '100295' 
                                       WHEN student = '26' THEN '100981'
                                  END)
      WHERE year = '2019' AND student IN ('10','17','26');
      
      1. 使用 else 语句,但这将扫描整个表:
      UPDATE table SET student = (CASE WHEN student = '10' THEN '100412'
                                       WHEN student = '17' THEN '100295' 
                                       WHEN student = '26' THEN '100981'
                                       ELSE student
                                  END)
      WHERE year = '2019';
      

      【讨论】:

        【解决方案4】:

        您可以使用in= 运算符

        WHERE year = '2019' AND (student = '10' or student = '17' or student  ='26');
        

        【讨论】:

        • 不好。没有括号,您会得到WHERE (year = '2019' AND student = '10') or student = '17' or student ='26',这不是您需要的。
        • 可能是这样的WHERE year = '2019' AND (student = '10' or student = '17' or student ='26');
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-17
        • 1970-01-01
        • 1970-01-01
        • 2015-01-31
        • 2017-06-10
        相关资源
        最近更新 更多