有了这个表,我想找到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中完成吗?创造功能?
答案 0 :(得分:2)
在使用该表和列设计的MySQL中,这将是相当困难的。您打算如何区分应该进行哪种比较?通过字符串比较来查看您的varchar字段是否包含百分号?
我建议将容差字段分成(至少)两个int / float列,比如tol
和tol_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
;