我有一个应用程序,用户可以在其中设置操作数和值,例如
"如果人的年龄> 21"
将此视为表rule
中的条目:
subject | operator | operand
-----------+----------+--------
age | gt | 21
haircolor | eq | brown
另一方面,我有一个像personproperty
,
subject | value
-----------+------
age | 21
haircolor | blonde
在我的应用程序中,我将使用subject
一起加入这些内容。比如,我想找到与给定用户匹配的规则。
由于operator
可能会有所不同,因此在查询时我需要以某种方式解决这个问题。是否有可能比
WHERE
(
(rule.operator = 'gt' AND personproperty.value > rule.operand)
OR (rule.operator = 'ge' AND personproperty.value >= rule.operand)
OR (rule.operator = 'lt' AND personproperty.value < rule.operand)
[... yougettheidea ...]
感谢您的意见和建议!
答案 0 :(得分:0)
只有一个处理所有这些的查询可能很棘手,因为可能存在大量规则。
如果您根据这些规则的内容生成SQL WHERE子句,那么您可能会更幸运。您的WHERE子句也可能提供更大的灵活性,因此您可以拥有一系列运算符。
答案 1 :(得分:0)
如果直接在表格中存储符号,则可以更轻松地生成准备语句。
喜欢&#39; eq&#39; as&#39; =&#39; ,gt as&#39;&gt;&#39;等...
您必须创建过程才能使用预准备语句
declare i_count integer ;
declare i integer default 0;
declare sub varchar(45) ;
declare opr varchar(45);
drop temporary table if exists temp_tbl;
create temporary table temp_tbl
(
sub varchar(50),
value varchar(50)
);
select count(*) into i_count from rule;
while i < i_count do
select a.subject as s,concat(a.operator," '",a.operand,"'") as value into sub,opr
from rule a
order by subject
limit i,1 ;
set @sql = concat("insert into temp_tbl select * from personproperty b where b.subject = '",
sub ,"' and b.value ", opr) ;
prepare stmt from @sql;
execute stmt;
deallocate prepare stmt;
set i = i+ 1;
end while ;
select * from temp_tbl ;