php - 评估数学表达式

标签 php mysql sql

我不确定如果没有存储过程这是否可行,但我希望这是可能的:

我的数据库中有一列存储类似 3 < x < 5 的信息或 20 >= x >= 10等等等等。如果我们将#插入x,我需要评估表达式是否为真.

目前,我正在使用正则表达式和 eval 的组合来确定表达式是否为真,如下所示:

$evalExpression = '3<x<5';
$evalValue = 4;

preg_match("#^(.*?)(<=|>=|<|>)(.*?)(<=|>=|<|>)(.*?)$#", $evalExpression, $evalPieces);

if (eval("return {$range_pieces[1]} {$range_pieces[2]} $response && $response {$range_pieces[4]} {$range_pieces[5]};")) {
    return true;
}

但是,我正在尝试找出一种方法,我可以单独使用 SQL(MySQL) 来完成此操作。例如:

SELECT 3 < 4 && 4 < 5 FROM table X

有人知道这是否可行吗?完成这样的事情是否需要存储过程?我确信不同的数据库模式会使这更容易,但我继承了这种结构,并且在求助于更改模式之前试图弄清楚我的需求是否可以实现。

谢谢!

最佳答案

也许不是您正在寻找的答案,但我会改变您在此处存储信息的方式,这将使数据库级别的评估成为可能...

避免使用魔法字符串,而是明确每一列中的信息

magic_string 
------------
3 < x < 5
20 >= x >= 10

可能成为

upper_bound | ub_inclusive | lower_bound | lb_inclusive
------------|--------------|-------------|---------------
5           |N             |3            |N
20          |Y             |10           |Y

你的查询变得可行

SEL * FROM TABLE WHERE 
      (
         (x < upper_bound and ub_inclusive = 'N') OR 
         (x <= upper_bound and ub_inclusive = 'Y')
      ) AND (
         (x > lower_bound and lb_inclusive = 'N') OR 
         (x >= lower_bound and lb_inclusive = 'Y')
      )

*这是同一查询的优化版本

SEL * FROM TABLE WHERE 
      (
         (x < upper_bound ) OR (x = upper_bound and ub_inclusive = 'Y')
      ) AND (
         (x > lower_bound ) OR (x = lower_bound and lb_inclusive = 'Y')
      )

关于php - 评估数学表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16401929/

相关文章:

mysql - 尝试在 MySQL Workbench 中导入 sql 转储时使用 sql_mode 出现错误 1231 (42000)

php - 在 Views laravel 上使用 carbon

php - @#variable 在 php 中的含义?

php - 如何获取数据库字段+ mysql中的realesacpe值

php - 如何从 PHP 中的文本字符串中删除隐藏字符?

php - Mysql:在一个查询中选择计数和 IN 子句

java - Java中order by子句的SQL注入(inject)漏洞

php - 如何使用 jqgrid 发布数据中的 PHP 数组重新格式化 m/d/y 中的日期?

java - com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException : Unknown column 'email' in 'where clause'

mysql - 如何在mysql中对create_date和update_date进行排序