如何在mysql查询中搜索复杂的数字


how do i search between complicated numbers on mysql query?

我在一个名为MM.的列中有这个数字4.40-4.85X3.60

我想通过mysql搜索每个数字中大3点或低3点的数字,例如:

[4.37-4.43]-[4.82-4.88]X[0-9],X后面的数字可以是任何数字。

我试着使用正则表达式,但没有找到真正有效的表达式,请注意。

对这三个数字使用单独的列,这将解决所有问题。

否则,请使用以下内容:

WHERE
    CAST(SUBSTR(MM FROM 1 FOR (@tmp1:=POSITION("-" IN MM))) AS DECIMAL(3,2))
        BETWEEN 4.37 AND 4.43
    AND
    CAST(SUBSTR(MM FROM @tmp1 FOR POSITION("X" IN MM)-@tmp1) AS DECIMAL(3,2))
        BETWEEN 4.82 AND 4.88

但请记住,这完全会影响你桌上的任何索引。

一种方法是"拆分"该字符串,以从中获得所需的单独组件。假设该字符串始终使用"-"answers"X"来分隔这三个组件,则该查询中的表达式将为您"拆分"它:

SELECT SUBSTRING_INDEX(@n,'-',1) AS s1
     , SUBSTRING_INDEX(SUBSTRING_INDEX(@n,'-',-1),'X',1) AS s2 
     , SUBSTRING_INDEX(@n,'X',-1) AS s3 
  FROM (SELECT @n := '4.40-4.85X3.6') n

然后,您可以将这些表达式中的每一个转换为数字。

请注意,MySQL可能会(静默地)丢失精度数字,可能会为无法转换为数字的字符串返回"0",或者MySQL可能会引发异常或警告。

因此,请注意选择DECIMAL(m,n)小数位数和精度,以避免溢出并正确处理舍入/截断。示例中显示的所有数据都符合DECIMAL(3,2),但这只是一个示例,不能保证所有数据。

我会在内联视图中转换"搜索参数"字符串,并将其连接到要搜索的表中。

类似这样的东西:

SELECT t.MM
  FROM mytable t
  JOIN (SELECT CONVERT(SUBSTRING_INDEX(@n,'-',1)                        ,DECIMAL(6,2)) AS s1
             , CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(@n,'-',-1),'X',1),DECIMAL(6,2)) AS s2 
             , CONVERT(SUBSTRING_INDEX(@n,'X',-1)                       ,DECIMAL(6,2)) AS s3 
          FROM (SELECT @n := '4.40-4.85X3.6') n
        ) p
     ON ABS(p.s1 - CONVERT(SUBSTRING_INDEX(t.MM,'-',1),DECIMAL(6,2))) 
        <= .03
    AND ABS(p.s2 - CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(t,MM,'-',-1),'X',1),DECIMAL(6,2))
        <= .03

JOIN谓词只是从搜索参数的(派生)数值中减去表中的(派生的)数值,然后检查差异。

同样,正如我之前所指出的,在转换为DECIMAL操作中,要注意字符串格式不符合预期、值太大而无法适应小数位数(溢出)以及舍入/截断等问题。您可能会得到意外的结果(MySQL可能会失去精度和伸缩性,或者可能引发异常和/或警告。(行为取决于会话的sql_mode设置。)