我有一个这样的表:
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;
但我所有的都是语法错误。请帮忙!
好像你在混合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
您的查询中存在一些问题。
编辑:
要选择动态列,需要构建如下的动态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;
尝试通过参数化动态查询来降低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;