用于设置计算字段值的mySQL存储过程

oxf4rvwz  于 2023-01-08  发布在  Mysql
关注(0)|答案(3)|浏览(127)

我有一个设想:
我在一个表中有5个布尔字段,我需要根据这5个布尔字段的真值数量设置一个选项集值:
字段1字段2字段3字段4字段5
ENUM字段1值(A、B、C、D、E)
如果其中5个布尔字段为True,则将ENUM字段值设置为A,4个为True,将它们设置为B,依此类推
由于我将来可能需要更改这些值的逻辑,因此我需要在保存时在DB端设置/更改它们,而不是在控制器上。
谢啦,谢啦
由于我不熟悉存储过程,我无法设法找到解决办法。

jgovgodb

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

rqcrx0a6

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语句没有什么不同。

pxiryf3j

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。

相关问题