结果字段相关的oparand

时间:2014-04-15 11:40:50

标签: mysql

我有一个应用程序,用户可以在其中设置操作数和值,例如

"如果人的年龄> 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 ...]

感谢您的意见和建议!

2 个答案:

答案 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 ;