SQL Table 基于条件的值设计

SQL Table design for condition based values

我需要根据值的范围存储配置信息值。

这是要求:我想根据字段值存储颜色代码。例如,如果字段值为:

fieldValue > 0.5 then Red , 
fieldValue > 0.3 && fieldValue < 0.4 then Amber 
fieldValue < 0.3 then Green 
fieldValue < 0 then Blue 

目前,我想到了下面的table设计

create table conditional_config    
(    
 condition_id varchar2(50) primary key,    
 condidtion  varchar2(100),    
 color_value archer(20)     
);    

示例条目如下所示(contain_id、条件、值)

condition1, >0.5, RED 
condition2, >0.3 && 0.5<, AMBER 
condition3, >0 && <0.3, GREEN 
condition4, <0, BLUE 

提出更好的设计方案。

如果您要使用该数据以编程方式计算颜色,我建议将其分成两个字段:LowerLimit 和 UpperLimit。将这些字段设为数字,然后您就可以直接使用它们而无需进行大量解析:

create table conditional_config    
(    
    condition_id varchar2(50) primary key,    
    lowerLimit float(3,2),    
    upperLimit float(3,2),
    color_value archer(20)     
);    

对于红色,可以设置upperLimit为3.402823466E+38

对于蓝色,可以将lowerLimit设置为-3.402823466E+38

浮点数限制取自http://dev.mysql.com/doc/refman/5.1/en/numeric-type-overview.html

我会先稍微改变标准的陈述方式:

fieldValue > 0.5 then Red
fieldValue > 0.3 then Amber
fieldValue > 0.0 then Green
fieldValue > -9999 then Blue

规则为“适用颜色值是小于或等于条件值的最大值。

Values:
Field Color
===== =====
0.5   Red
0.3   Amber
0.0   Green
-9999 Blue

这给出了以下查询:

select  c.ConditionValue, v.Color
from    Conditions c
join    Values     v
    on  v.Value =(
            select  Max( Value )
            from    Values
            where   Value <= c.ConditionValue );

现在,我已经创建了一个任意下限,如果您知道您的值可能包含的下限,这可能会很好地工作。如果不知道,您可以将下边界从 -9999 更改为 NULL 或完全删除该行。那么查询将是:

select  c.ConditionValue, IfNull( v.Color, BLUE ) as Color
from    Conditions c
left join Values   v
    on  v.Value =(
            select  Max( Value )
            from    Values
            where   Value <= c.ConditionValue );

但是您必须从 table 中删除代码中的蓝色,这不是最佳形式。