我有一个场景:
我在一个表中有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
存储过程只是将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。