Хранимая процедура MYSQL. Обновление нескольких столбцов при соблюдении определенных условий. - PullRequest
0 голосов
/ 26 сентября 2019

Мой 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 обновляется со значением параметра, иначе donне обновлять столбец вообще.

Есть ли способ сделать это?Может быть, с оператором 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   |
+------+-----------+-----------+-----------+----------+--------+

Ответы [ 3 ]

0 голосов
/ 26 сентября 2019

Использование 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
0 голосов
/ 26 сентября 2019

Если вам нужно обработать специальное «нулевое» значение, тогда 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.Логика вполне явная.

0 голосов
/ 26 сентября 2019

попробуйте это:


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</p>

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 //

DELIMITER;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...