评估数学表达式

Mik*_*ike 0 php mysql sql

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

我的数据库中有一个列存储像3 < x < 520 >= 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;
}
Run Code Online (Sandbox Code Playgroud)

但是,我试图找到一种方法,我可以单独使用SQL(MySQL)来实现这一点.例如:

SELECT 3 < 4 && 4 < 5 FROM table X
Run Code Online (Sandbox Code Playgroud)

有谁知道这是否可能?存储过程是否有必要完成这样的事情?我确信一个不同的数据库模式可以使这更容易,但我继承了这个结构,并试图找出我的需求是否可以在诉诸更改模式之前完成.

谢谢!

gbt*_*mon 5

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

避免魔术字符串,而是明确每列中的信息

magic_string 
------------
3 < x < 5
20 >= x >= 10
Run Code Online (Sandbox Code Playgroud)

可能会成为

upper_bound | ub_inclusive | lower_bound | lb_inclusive
------------|--------------|-------------|---------------
5           |N             |3            |N
20          |Y             |10           |Y
Run Code Online (Sandbox Code Playgroud)

你的查询变得可行

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')
      )
Run Code Online (Sandbox Code Playgroud)

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

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')
      )
Run Code Online (Sandbox Code Playgroud)