我有一个设想:我在一个表中有5个布尔字段,我需要根据这5个布尔字段的真值数量设置一个选项集值:字段1字段2字段3字段4字段5ENUM字段1值(A、B、C、D、E)如果其中5个布尔字段为True,则将ENUM字段值设置为A,4个为True,将它们设置为B,依此类推由于我将来可能需要更改这些值的逻辑,因此我需要在保存时在DB端设置/更改它们,而不是在控制器上。谢啦,谢啦由于我不熟悉存储过程,我无法设法找到解决办法。
jgovgodb1#
也许生成列更合适?它将始终提供实际值,而不是每次需要实际值时都必须执行的存储过程。
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
| 字段1|字段2|字段3|字段4|字段5|| - ------| - ------| - ------| - ------| - ------|| 1个|1个|1个|1个|1个|| 1个|1个|无|1个|1个|| 1个|无|1个|无|1个|| 1个|1个|无|无|无|| 无|无|无|1个|无|| 无|无|无|无|无|一个二个一个一个| 字段1|字段2|字段3|字段4|字段5|枚举字段1|| - ------| - ------| - ------| - ------| - ------| - ------|| 1个|1个|1个|1个|1个|A类|| 1个|1个|无|1个|1个|乙|| 1个|无|1个|无|1个|C级|| 1个|1个|无|无|无|D级|| 无|无|无|1个|无|E级|| 无|无|无|无|无|F级|fiddle
rqcrx0a62#
存储过程只是把你的SQL放到服务器上,而不是从客户端调用它。它没有什么特别之处,也不是一种编写逻辑在服务器上运行的方法(有很多方法可以做到这一点,不同的编程语言会有所不同,但不推荐DB作为存储应用程序代码的地方)使用以下语法创建SP。在中间使用您自己的SQL。
CREATE PROCEDURE sp_GetMovies(IN name varchar(50)) BEGIN SELECT title, description FROM movies WHERE title LIKE name; END
调用方式因客户机语言而异,但通常与调用参数化SQL语句没有什么不同。
pxiryf3j3#
假设枚举从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;
例如如果存在则丢弃表t;
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。
3条答案
按热度按时间jgovgodb1#
也许生成列更合适?它将始终提供实际值,而不是每次需要实际值时都必须执行的存储过程。
演示
| 字段1|字段2|字段3|字段4|字段5|
| - ------| - ------| - ------| - ------| - ------|
| 1个|1个|1个|1个|1个|
| 1个|1个|无|1个|1个|
| 1个|无|1个|无|1个|
| 1个|1个|无|无|无|
| 无|无|无|1个|无|
| 无|无|无|无|无|
一个二个一个一个
| 字段1|字段2|字段3|字段4|字段5|枚举字段1|
| - ------| - ------| - ------| - ------| - ------| - ------|
| 1个|1个|1个|1个|1个|A类|
| 1个|1个|无|1个|1个|乙|
| 1个|无|1个|无|1个|C级|
| 1个|1个|无|无|无|D级|
| 无|无|无|1个|无|E级|
| 无|无|无|无|无|F级|
fiddle
rqcrx0a62#
存储过程只是把你的SQL放到服务器上,而不是从客户端调用它。它没有什么特别之处,也不是一种编写逻辑在服务器上运行的方法(有很多方法可以做到这一点,不同的编程语言会有所不同,但不推荐DB作为存储应用程序代码的地方)
使用以下语法创建SP。在中间使用您自己的SQL。
调用方式因客户机语言而异,但通常与调用参数化SQL语句没有什么不同。
pxiryf3j3#
假设枚举从A-Z开始,然后使用ascii转换,其中dec 65是A
例如
如果存在则丢弃表t;
如果你有越来越多的列,那么你将需要动态sql。