如何搜索包含输入参数的列并更新该列?

问题描述 投票:0回答:1

我有一个这样的表:

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;

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

mysql sql
1个回答
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,而不是'真'和'假'
  3. 你不需要输入参数'column'
  4. 不要使用保留关键字作为参数名称,例如“列”。

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;
© www.soinside.com 2019 - 2024. All rights reserved.