0

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

我的数据库中有一个列,用于存储诸如3 < x < 5or20 >= 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

有谁知道这是否可能?是否需要存储过程来完成这样的事情?我确信不同的数据库架构会使这更容易,但我继承了这个结构,并试图在改变架构之前弄清楚我的需求是否可以满足。

谢谢!

4

3 回答 3

5

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

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

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')
      )
于 2013-05-06T15:30:47.187 回答
2

我建议您为每种类型的检查使用单独的列对规则表进行建模,每列都是数字数据类型,这允许在该规则不适用的情况下使用 NULL。

例如

CREATE TABLE RULES
(   RULE,ID
    ,EQUAL
    ,GREATER_THAN
    ,GREAR_THAN_EQUAL
    ,LESS_THAN
    ,LESS_THAN_EQUAL
)

你上面的第一个例子3 < x < 51|NULL|3|NULL|5|NULL

于 2013-05-06T15:31:15.273 回答
0

从纯粹的句法角度来看,您可以执行以下操作:

SELECT 3 < 4 && 4 < 5; -- echoes 1 (true)
SET @s = 'SELECT 3<4'; PREPARE stmt FROM @s; EXECUTE stmt; -- echoes 1 (true)

请注意,您可以动态构建@s

但是我强烈同意 gbtimmon 的建议(即避免使用魔法字符串)。

于 2013-05-06T15:34:23.807 回答