【问题标题】:Mysql Stored Procedure Equation Step By Step for newbie?新手的Mysql存储过程方程一步一步?
【发布时间】:2018-08-09 07:28:35
【问题描述】:

您好,我是 MySQL 新手,需要此案例的逐步帮助

我有数据库名称p_data 其中有不同的表与indexunique值的关系

第一个表名是f_table

 -----------------
 |    f_table    |
 -----------------
 |      AV2      |
 |               |
 -----------------

第二张桌子是s_table

 -----------------
 |    s_table    |
 -----------------
 |      AV3      |
 |               |
 ----------------

我想让每个数据条目的每个 AV3 值等于这个公式,如 Excel

 AV3 =

 =IF(AND(AV2>=1, AV2<40), 0, IF(AND(AV2>=40, AV2<=49), 18, 
  IF(AND(AV2>=50, AV2<=59), 36, IF(AND(AV2>=60, AV2<=69), 55, 
  IF(AND(AV2>=70, AV2<=79), 73,IF(AND(AV2>=80),91,"")))))) 

示例

 if AV2 >= 1 or < 40 
 So AV3 = 0

 if AV2 >= 40 or =< 49 
 So AV3 = 18

 and So on ...

如何运行 MySQL 来处理每个数据条目并根据第一个等式示例运行值并自动将其从第一个表添加到每个数据条目的第二个表?

【问题讨论】:

  • 在 excel 中引用您的操作方式并没有多大帮助 - 问题最好用简单的英语解释您的要求。
  • 我已经做了例子 if AV2 >= 1 or

标签: mysql sql database stored-procedures


【解决方案1】:

这是对尼克答案的调整:

UPDATE s_table s JOIN
       p_table p
       ON s.id = p.id
    SET s.AV3 = (CASE WHEN p.AV2 < 40 AND p.AV2 >= 0 THEN 0
                      WHEN p.AV2 < 50 THEN 18
                      WHEN p.AV2 < 60 THEN 36
                      WHEN p.AV2 < 70 THEN 55
                      WHEN p.AV2 < 80 THEN 73
                      WHEN p.AV2 >= 80 THEN 91
                      ELSE NULL
                 END);

变化是:

  • CASE 表达式的简化,认识到这些值是按顺序实现的。
  • ELSE 子句修复为使用NULL,因此类型一致。

【讨论】:

  • 感谢 Gordon,但输出显示 #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 4 行的 '> 0 THEN 0 WHEN p.AV2
  • 我不会反对你编辑我的答案。关于 NULL 的观点很好;我只是简单地从 OPs 帖子中复制了价值,而没有真正考虑过。
  • @尼克。 . .这似乎是一个巨大的变化。我赞成你的回答。
  • 请允许我报答。
【解决方案2】:

假设p_tables_table 都有一个字段id 对应的条目具有相同的值,您可以这样做:

UPDATE s_table s
JOIN p_table p ON s.id=p.id
SET s.AV3 = CASE 
    WHEN p.AV2 BETWEEN 1 AND  39 THEN 0
    WHEN p.AV2 BETWEEN 40 AND  49 THEN 18
    WHEN p.AV2 BETWEEN 50 AND  59 THEN 36
    WHEN p.AV2 BETWEEN 60 AND  69 THEN 55
    WHEN p.AV2 BETWEEN 70 AND  79 THEN 73
    WHEN p.AV2 >= 80 THEN 91
    ELSE NULL
    END

编辑正如@GordonLinoff 指出的那样,最好让ELSE 子句返回NULL 而不是'',以与整数数据类型保持一致。

【讨论】:

  • DELIMITER // 创建过程 cal_me BEGIN UPDATE s_table s JOIN p_table p ON s.id=p.id SET s.AV3 = CASE WHEN p.AV2 BETWEEN 1 和 39 THEN 0 WHEN p.AV2 BETWEEN 40 和 49 然后 18 当 p.AV2 在 50 和 59 之间 然后 36 当 p.AV2 在 60 和 69 之间 然后 55 当 p.AV2 在 70 和 79 之间 然后 73 当 p.AV2 >= 80 然后 91 否则结束 // DELIMITER ;
  • MySQL 说:文档 #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的“BEGIN UPDATE s_table s JOIN p_table p ON s.id=p.id SET s.AV3 = CASE WHE”附近使用正确的语法
  • 哇工作完美,,,我怎样才能在这个数据库中自动运行
  • 要让它自动运行,您需要设置一个插入触发器。看看manual,试一试,如果你不能让它工作,这将是一个很好的新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
相关资源
最近更新 更多