解释SQL中的编码字段

时间:2010-02-08 16:14:58

标签: sql mysql

有了这个表,我想找到Val拟合我的Indata的行。

Tol字段是容差(varchar),可以是整数/浮点数或百分比值。

Row Val Tol   Outdata
1   24  0     A
2   24  5     B
3   24  10    C
4   32  %10   D
5   32  1     E

Indata 30例如应该匹配第3行(24 + 10 = 34)和4(32-10%= 28.8)。

这可以在mySQL中完成吗?创造功能?

3 个答案:

答案 0 :(得分:2)

在使用该表和列设计的MySQL中,这将是相当困难的。您打算如何区分应该进行哪种比较?通过字符串比较来查看您的varchar字段是否包含百分号?

我建议将容差字段分成(至少)两个int / float列,比如toltol_pct。为了灵活性,我将tol_pct表示为小数(10%=> .10)。然后,您可以执行如下查询:

select * 
from table 
where
    (Indata between Val - tol and Val + tol) 
    or (Indata between Val * (1 + tol_pct) and Val * (1 - tol_pct))

答案 1 :(得分:1)

当然可以做到。但是,让我告诉您,您最好检查一下您的数据库设计,因为它与规范化相当矛盾。有关快速概述,请参阅http://en.wikipedia.org/wiki/Database_normalization

答案 2 :(得分:1)

我没有安装MySQL进行测试,但是此示例是从Oracle sql语法转换而来的。您必须使用字符串函数来确定tol是否为百分比,并相应地采取行动来计算该字段的最小和最大范围。然后你可以使用一个between子句。

select * 
  from (select t.*,
               case when substr(tol, 1, 1) = '%' then 
                      t.val * (1 + convert('.' + substr(tol, 2), number))
                    else 
                      t.val + convert(tol, number)
               end maxval,
               case when substr(tol, 1, 1) = '%' then 
                      t.val * (1 - convert('.' + substr(tol, 2), number))
                    else convert(t.val - tol, number)
               end minval
          from mytable
       ) t
where 30 between minval and maxval
;