我不确定如果没有存储过程这是否可行,但我希望它是可能的:
我的数据库中有一个列,用于存储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
有人知道这是否可行?存储过程是否有必要完成这样的事情?我确信一个不同的数据库模式可以使这更容易,但我继承了这个结构,并试图找出我的需求是否可以在诉诸更改模式之前完成。
谢谢!
答案 0 :(得分: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')
)
答案 1 :(得分:2)
我建议你为每种检查类型的单独列建立规则表的模型 column是一个数字数据类型,允许NULLS不适用该规则。
例如
CREATE TABLE RULES
( RULE,ID
,EQUAL
,GREATER_THAN
,GREAR_THAN_EQUAL
,LESS_THAN
,LESS_THAN_EQUAL
)
上面的第一个例子3 < x < 5
将是
1|NULL|3|NULL|5|NULL
答案 2 :(得分: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的建议(即避免使用魔法字符串)。