如何搜索具有输入参数的列并更新该列?

时间:2019-02-17 07:00:17

标签: mysql sql

我有一个这样的表:

CREATE TABLE TEST5 ([Id] INT, [A] BIT, [B] BIT, [C] BIT, [D] BIT, [E] BIT);
INSERT INTO TEST5 ([Id], [A], [C], [E]) VALUES (1, 'true', 'false', 'true')
INSERT INTO TEST5 ([Id], [A], [B], [C]) VALUES (2, 'true', 'true', 'true')
INSERT INTO TEST5 ([Id], [C], [D], [E]) VALUES (1, 'false', 'false', 'true')

我想做的是创建一个过程,使其接受参数(id INT,char(1)列)。如果由id和column匹配的单元格为true / false,则将其反转。否则,不会进行任何更改。 这是我所做的,但是无法运行。我正在使用mysql。

CREATE PROCEDURE invertValue(
    id INT,
    column char
)
BEGIN
UPDATE TABLEDB
SET column = SELECT a,b,c,d,e 
CASE column =
WHEN column = 'false' THEN 'true'
WHEN column = 'true' THEN 'false'
WHERE Id = id
END;

但是我仅有的是语法错误。请帮忙!

1 个答案:

答案 0 :(得分:1)

似乎您正在混合MS Sql和mysql。

要在BIT匹配时翻转ID的值,可以尝试如下操作。

UPDATE TEST5
SET A=NOT A, B= NOT B, C=NOT C, D=NOT D, E = NOT E
WHERE ID=1;
SELECT * FROM TEST5

查询中几乎没有问题。

  1. 不要在MySQL中使用[]作为列名。
  2. BIT只能容纳0或1,不能容纳“ true”和“ false”
  3. 您不需要输入参数“ column”
  4. 请勿使用保留关键字作为参数名称,例如'column'。

Demo

编辑:

要选择动态列,您需要构建如下的动态sql。

CREATE PROCEDURE invertValue(
    id INT,
    clm char
)
BEGIN
SET @t1 =CONCAT("UPDATE TEST5 SET ",clm,'= not ', clm," where ID=",id);
 PREPARE stmt3 FROM @t1;
 EXECUTE stmt3;
 DEALLOCATE PREPARE stmt3;

END;

SP Demo Online

通过如下所示的参数化动态查询,尽量降低SQL Injection Vulnerability的风险。

CREATE  PROCEDURE invertValue(
    id INT,
    clm char
)
BEGIN

  SET @t1 := concat('UPDATE TEST5 SET `', clm,'` = not `', clm, '` where id= ? ');   
  SET @id := id;
  PREPARE stmt FROM @t1;
  EXECUTE stmt USING @id;
  DEALLOCATE PREPARE stmt;

END;