解释SQL中的编码字段

解释SQL中的编码字段,sql,mysql,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中完成吗?创建函数?确保可以完成。但让我告诉你,你最好检查一下

有了这个表,我想找到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中完成吗?创建函数?

确保可以完成。但让我告诉你,你最好检查一下你的数据库设计,因为它与规范化有很大的冲突。请参阅以获得快速概述。

使用这种表和列设计,在MySQL中很难做到这一点。您计划如何区分应进行何种比较?通过进行字符串比较来查看varchar字段是否包含百分号

我建议将公差字段分成(至少)两个int/float列,例如
tol
tol\u 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))

我没有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
;

不确定MySQL如何处理空值,但您可能需要在此处添加一些检查。在Val-coalesce(tol,0)之间的Indata…我目前没有一个MySQL实例可供使用,因此我将把它作为操作的练习。where子句的每个“分支”也可以在前面加上类似于
tol不为null和…
的内容,我知道这个解决方案,这很可能就是我的做法,但对于这个问题,我想知道是否可以用另一种方法来解决。无论如何谢谢你!谢谢,我还没有试过,但这正是我想要的!但30似乎很奇怪……如果有人输入的是“10%”,而不是您期望的“%10”,会发生什么?这是一个脆弱的解决方案。@Petter Magnusson:30是您在示例中给出的“例如Indata 30应与第3行和第4行匹配”。替换要比较的任何值。@Alison R:我假设前导%符号是一个固定的规范。如果%符号可以位于字符串中的任何位置,则可以使用position函数进行替换。啊,对了!将测试它并返回。此外,还可以假设%处于固定的第一位置。