mySQL存储过程设置一个计算字段值



我有一个场景:

我在一个表中有5个布尔字段,我需要根据这5个布尔字段的真值的数量设置一个选项集值:

Field1Field2Field3Field4Field5

ENUMField1 values (A,B,C,D,E)

如果我有5个布尔字段为True,我将设置ENUM字段值为A,4个事实,我设它们为B等等

由于我将来可能需要更改这些值的逻辑,我需要在保存时在DB端设置/更改它们,而不是在控制器上。

感谢由于我不熟悉存储过程,我无法找到一个解决方案。

也许生成的列更合适?它将始终提供实际值,而不是每次需要实际值时都必须执行的存储过程。

演示
CREATE TABLE test (
Field1 BOOLEAN, 
Field2 BOOLEAN,
Field3 BOOLEAN,
Field4 BOOLEAN,
Field5 BOOLEAN);
INSERT INTO test VALUES
(1,1,1,1,1),
(1,1,0,1,1),
(1,0,1,0,1),
(1,1,0,0,0),
(0,0,0,1,0),
(0,0,0,0,0);
SELECT * FROM test;
Records: 6  Duplicates: 0  Warnings: 0
Field5000

存储过程只是将SQL放在服务器上,而不是从客户机调用它。它没有什么特别的,它不是一种编写在服务器上运行的逻辑的方法(有很多方法可以做到这一点,根据编程语言的不同,但不建议将DB作为存储应用程序代码的地方)

使用以下语法创建SP。中间使用你自己的SQL。

CREATE PROCEDURE sp_GetMovies(IN name varchar(50))
BEGIN
    SELECT title, description FROM movies WHERE title LIKE name;
END

如何调用它取决于您的客户端语言,但通常它与调用参数化SQL语句没有什么不同。

假设您的enum从A- z运行,然后使用ascii转换,其中dec 65是A

select * ,
cast(char(65+abs(col1-1)+abs(col2-1)+abs(col3-1)+abs(col4-1)+abs(col5 -1)) as char(1)) enumval
from t;

drop table if exists;
create table t
(col1 tinyint,col2 tinyint,col3 tinyint,col4 tinyint,col5 tinyint, e enum('a','b','c','d')
);
insert into t (col1,col2,col3,col4,col5) 
values
(1,1,1,1,1),
(1,1,1,1,0);
+------+------+------+------+------+------+---------+
| col1 | col2 | col3 | col4 | col5 | e    | enumval |
+------+------+------+------+------+------+---------+
|    1 |    1 |    1 |    1 |    1 | NULL | A       |
|    1 |    1 |    1 |    1 |    0 | NULL | B       |
+------+------+------+------+------+------+---------+

如果你有越来越多的列,那么你将需要动态sql。

相关内容

  • 没有找到相关文章

最新更新