我在名为 MM 的列中有这个数字 4.40-4.85X3.60。
我想通过mysql搜索每个数字大或小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
但请记住,这完全颠覆了您桌上可能拥有的任何索引。
一种方法是“拆分”该字符串以从中获取所需的单独组件。假设该字符串始终使用 '-' 和 '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 设置。)