【问题标题】:mysql combined statement with an individual test for each fieldmysql 组合语句与每个字段的单独测试
【发布时间】:2020-10-04 15:01:15
【问题描述】:

这些更新语句是否可以组合成一个更新语句或循环以组装所需的语句?目标是仅更新为空或 null 的字段。 P_Id 是 AI。 @Existing_P_Id = '1'(抱歉纠正 MI)

UPDATE participant 
SET First_Name = @existing_First_Name 
WHERE P_Id = @existing_P_Id AND First_Name = '';
    
UPDATE participant 
SET MI = @existing_MI 
WHERE P_Id = @existing_P_Id AND MI = '';
    
UPDATE participant 
SET Last_Name = @existing_Last_Name 
WHERE P_Id = @existing_P_Id AND Last_Name = '';

【问题讨论】:

  • 一如既往地不止一种给猫剥皮的方法。感谢您提供的所有帮助,它使我对组合语句有了一个很好的看法。似乎所有三种方式都是可行的。

标签: mysql sql string sql-update case


【解决方案1】:

我假设您的 MI 列应设置为变量 @existing_MI

UPDATE participant
SET First_Name = IFNULL(NULLIF(First_Name,''), @existing_First_Name),
    MI         = IFNULL(NULLIF(MI,''),         @existing_MI),
    Last_Name  = IFNULL(NULLIF(Last_Name,''),  @existing_Last_Name)
WHERE P_Id = @existing_P_Id;

参考:

  • IFNULL() 返回其第一个参数或第二个参数,第一个不为 NULL。
  • NULLIF() 如果第一个参数等于第二个参数,则返回 NULL,否则返回第一个参数。

【讨论】:

    【解决方案2】:

    您可以在WHERE 子句中使用IN,在SET 子句中使用条件表达式:

    UPDATE participant 
    SET 
        First_Name = CASE WHEN First_Name = '' THEN @existing_First_Name ELSE First_Name END,
        MI         = CASE WHEN MI         = '' THEN @existing_MI         ELSE MI         END,
        Last_Name  = CASE WHEN Last_Name  = '' THEN @existing_Last_Name  ELSE Last_Name  END
    WHERE 
        P_Id = @existing_P_Id 
        AND '' IN (First_Name, MI, Last_Name)
    

    【讨论】:

    • 我想我只想补充一点,Case 只能在存储过程或触发器中使用。
    【解决方案3】:

    你绝对可以做到。

    我猜您的@existing_whatever 会话变量中有您想要用于条件更新的值。我不明白你想要MI 什么,所以我没有回答。

    这是您的更新代码(请务必对此进行测试)。

    UPDATE participant SET
      first_name = IF(first_name IS NULL OR LENGTH(first_name) = 0, 
                      @existing_First_Name, last_name),
      last_name = IF(last_name IS NULL OR LENGTH(last_name) = 0,
                       @existing_Last_Name, last_name)
    WHERE P_Id = @existing_P_Id
    

    IF() 函数使用@existing_... 值或表中已有列的值进行条件更新。

    如果不需要任何更改,您可以将其添加到 UPDATE 的末尾以避免触及该行。

    AND (first_name IS NULL OR LENGTH(first_name) = 0  OR
         last_name IS NULL OR LENGTH(last_name) = 0)
    

    【讨论】:

      猜你喜欢
      • 2021-05-02
      • 1970-01-01
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 2014-04-05
      • 1970-01-01
      相关资源
      最近更新 更多