【问题标题】:MYSQL Stored Procedure - Update multiple columns if certain conditions are metMYSQL 存储过程 - 如果满足某些条件,则更新多个列
【发布时间】:2019-09-26 15:39:52
【问题描述】:

我的 MySQL 相当有限,我已经搜索了很多,但我想确认到目前为止我做了什么。

我正在尝试在 MySQL 中编写一个接受 5 个参数的存储过程。 4 个参数将包含将用于更新的列的值,以及将用于选择要更新的行的第 5 个值。

参数名称:p_name1、p_name2、p_name3、p_name4、p_parentId 列名:NAME_1、NAME_2、NAME_3、NAME_4、PARENT_ID

如果为 p_name1 设置了值,请使用参数值更新列 NAME_1,其中该行的 PARENT_ID = p_parentId AND p_name1 不为空。 对所有列执行此操作。在某些情况下,可能只需要更新几列,因此不会为其他列传递任何内容。 到目前为止,这是我想出的:

BEGIN
    UPDATE `NAMES_TABLE` SET `NAME_1` = p_name1 WHERE `PARENT_ID` = p_parentId AND p_name1 IS NOT NULL;
    UPDATE `NAMES_TABLE` SET `NAME_2` = p_name2 WHERE `PARENT_ID` = p_parentId AND p_name2 IS NOT NULL;
    UPDATE `NAMES_TABLE` SET `NAME_3` = p_name3 WHERE `PARENT_ID` = p_parentId AND p_name3 IS NOT NULL;
    UPDATE `NAMES_TABLE` SET `NAME_4` = p_name4 WHERE `PARENT_ID` = p_parentId AND p_name4 IS NOT NULL;
END

但是,也存在需要将列设置为 null 的情况。也许为此我可以使用某种 If 语句进行更新,如果参数设置为关键字(即“null”作为文本),将列设置为 null,否则如果参数 IS NOT NULL 使用参数值更新,否则不要'根本不更新列。

有没有办法做到这一点?也许在更新中带有 if 或 case 语句?

感谢您能给我的任何帮助。

示例:

带有值的原始表格

+------+-----------+-----------+-----------+----------+--------+
|   ID |  PARENT_ID| NAME_1    | NAME_2    | NAME_3   | NAME_4 | 
+------+-----------+-----------+-----------+----------+--------+
|  1   |  NULL     | APRIL     | AMBER     | ALFRED   | ALEX   |
|  2   | 1         | BOB       | BILL      | BURT     | BELINDA|
|  3   | 1         | BOB       | BILL      | BURT     | BELINDA|
|  4   | NULL      | CHARLES   | CASPER    | CONNOR   | CARL   |
+------+-----------+-----------+-----------+----------+--------+

传入参数:

p_name1 = JAMES, p_name2 = null, p_name3 = JEN, p_name4 = "null", p_parentId = 1

结果:

+------+-----------+-----------+-----------+----------+--------+
|   ID |  PARENT_ID| NAME_1    | NAME_2    | NAME_3   | NAME_4 | 
+------+-----------+-----------+-----------+----------+--------+
|  1   |  NULL     | APRIL     | AMBER     | ALFRED   | ALEX   |
|  2   | 1         | JAMES     | BILL      | JEN      | null   |
|  3   | 1         | JAMES     | BILL      | JEN      | null   |
|  4   | NULL      | CHARLES   | CASPER    | CONNOR   | CARL   |
+------+-----------+-----------+-----------+----------+--------+

【问题讨论】:

  • @GordonLinoff 更新了原帖

标签: mysql sql stored-procedures


【解决方案1】:

试试这个:


DELIMITER //
CREATE PROCEDURE usp_name (IN @p_name1 varchar(20)) NULL, 
                            IN @p_name2 varchar(20) NULL, 
                            IN @p_name3 varchar(20) NULL, 
                            IN @p_name4 varchar(20) NULL, 
                            IN @p_parentId varchar(20) NULL)
AS
BEGIN

UPDATE NAMES_TABLE 
SET Name_1 = IFNULL(@p_name1, Name_1 ),
    Name_2 = IFNULL(@p_name2, Name_2 ),
    Name_3 = IFNULL(@p_name3, Name_3 ),
    Name_4 = IFNULL(@p_name4, Name_4 )
WHERE 'PARENT_ID' = @p_parentId; 

结束//

分隔符;

【讨论】:

    【解决方案2】:

    使用ifnull-函数:

    BEGIN
      UPDATE NAMES_TABLE SET 
        NAME_1 = ifnull( p_name1, NAME_1),
        NAME_2 = ifnull( p_name2, NAME_2),
        NAME_3 = ifnull( p_name3, NAME_3),
        NAME_4 = ifnull( p_name4, NAME_4)
      WHERE PARENT_ID = p_parentId;
    END
    

    【讨论】:

      【解决方案3】:

      如果需要处理特殊的“null”值,则需要CASE逻辑或多个函数调用:

      UPDATE NAMES_TABLE 
          SET Name_1 = (CASE WHEN @p_name1 = '<null>' THEN NULL
                             WHEN @p_name1 IS NOT NULL THEN @p_name1
                             ELSE Name_1
                        END),
              Name_2 = (CASE WHEN @p_name2 = '<null>' THEN NULL
                             WHEN @p_name2 IS NOT NULL THEN @p_name2
                             ELSE Name_2
                        END),
              Name_3 = (CASE WHEN @p_name3 = '<null>' THEN NULL
                             WHEN @p_name3 IS NOT NULL THEN @p_name3
                             ELSE Name_3
                        END),
              Name_4 = (CASE WHEN @p_name4 = '<null>' THEN NULL
                             WHEN @p_name4 IS NOT NULL THEN @p_name4
                             ELSE Name_4
                        END)
      WHERE PARENT_ID = @p_parentId; 
      

      如果你愿意,你可以缩短它:

      UPDATE NAMES_TABLE 
          SET Name_1 = NULLIF(COALESCE(@p_name1, Name_1), '<null>'),
              Name_2 = NULLIF(COALESCE(@p_name2, Name_2), '<null>'),
              Name_3 = NULLIF(COALESCE(@p_name3, Name_3), '<null>'),
              Name_4 = NULLIF(COALESCE(@p_name4, Name_4), '<null>')
      WHERE PARENT_ID = @p_parentId; 
      

      我向刚接触 SQL 的人推荐第一个版本。逻辑很明确。

      【讨论】:

      • 这看起来很完美,非常感谢,我会试试这个。我对存储过程完全陌生,是否需要在其中添加任何内容才能在存储过程中使用它?
      猜你喜欢
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      相关资源
      最近更新 更多