【问题标题】:evaluate expression in MySQL在 MySQL 中计算表达式
【发布时间】:2013-06-11 13:58:41
【问题描述】:

我有一个表,其中包含 a、b、expr 列,其中 expr 是来自其他列的表达式。 例如表包含

a   b   expr
------------
2   5   a+b
3   4   a*b+3

我喜欢简单地运行查询并获得流畅的结果:

a | b | expr 
------------ 
2 | 5 | 7 
3 | 4 | 15

我在文档中搜索功能、过程等,但我做不到。 请帮帮我!

【问题讨论】:

  • 查询数据的时候要实现这个吗?或者当你插入数据时
  • 我认为这在纯 sql 中是不可能的。也许某种存储过程将使之成为可能。我建议将这种抽象转移到编程语言中。

标签: mysql sql


【解决方案1】:

这是我为有趣制作的解决方案。如果这不是一次性的事情,请考虑使用真正的编程语言来解决这个问题。

drop table if exists Table1;
CREATE TABLE Table1
    (`a` int, `b` int, `expr` varchar(6))
;

INSERT INTO Table1
    (`a`, `b`, `expr`)
VALUES
    (2, 5, 'a+b'),
    (3, 4, 'a*b +3')
;

drop table if exists Table2;
CREATE TABLE Table2
    (`a` int, `b` int, `expr` int)
;

drop procedure if exists curdemo;
DELIMITER $$
CREATE PROCEDURE curdemo()
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE seqel VARCHAR(255);
  DECLARE cur1 CURSOR FOR SELECT CONCAT('INSERT INTO Table2 (a, b, expr) SELECT a, b, ' , expr, ' FROM (SELECT ', a, ' as a, ', b, ' as b) sq;') FROM Table1;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

  OPEN cur1;

  REPEAT
    FETCH cur1 INTO seqel;
    IF NOT done THEN
       SET @sql:=seqel;
       PREPARE stmt FROM @sql;
       EXECUTE stmt;
       DEALLOCATE PREPARE stmt;
    END IF;
  UNTIL done END REPEAT;

  CLOSE cur1;
END $$
DELIMITER ;

CALL curdemo();

SELECT * FROM Table2;

【讨论】:

  • @saeidArianpour 有任何反馈吗?
  • 感谢@tombom,您的解决方案奏效了!但它并不简单,我不能使用它。
  • 我的输入表很大,每次我只需要一些行,并且一个多线程程序获取该查询,所以如果我使用你的程序,我必须将结果保存到单独的表中(或在一个表中)带有新列的表)。它降低了效率。我正在寻找一个简单的效率解决方案。
  • 你找不到纯 SQL 的。这不是数据库的用途。使用 PHP 什么的。
  • @saeidArianpour 为了清楚起见,我的解决方案是一次性的,因为它根本没有效率。如果您不向表中插入更多行,则不必重新执行此操作。然后你只需SELECT whatever FROM Table2; 只是想确定一下,这很清楚。
【解决方案2】:

如果我正确理解了您的问题,这就是您正在寻找的内容:

SELECT a, b, (a+b) AS expr FROM yourtable;

【讨论】:

  • 不,这不是我想要的。 expr 在行中不同,例如下一行 expr=a*b+3
  • 我认为这是他想要的,除了 expr 可以是可变的。例如expr="(a % b)" 或 expr="(a*b)"
  • @saied Arianpour :您应该在问题中更清楚地解释这一点。我们不明白您希望每行使用不同的表达式
  • 好吧,我的朋友,据我所知,如果没有一组给定的遵循某种逻辑的规则,你真的无法做到这一点,正如 Frédéric 建议的那样,请更具体地回答你的问题.
  • ok, select a,b,expr from mytable return 2,5,a+b 我想运行一个查询,它返回 2,5,7
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多