Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在mysql查询中搜索复杂的数字?_Php_Mysql_Regex - Fatal编程技术网

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

Php 如何在mysql查询中搜索复杂的数字?,php,mysql,regex,Php,Mysql,Regex,我把这个数字4.40-4.85X3.60放在一个名为MM的列中 我想通过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))

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

我想通过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可能会抛出异常或警告

因此,请注意选择小数、n标度和精度,以避免溢出并正确处理舍入/截断。示例中显示的所有数据都符合小数点3,2,但这只是一个示例,不能保证所有数据都符合小数点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
连接谓词只是从搜索参数的派生数值中减去表中的派生数值,然后检查差异


同样,正如我前面提到的,使用convert to DECIMAL操作时,要注意字符串格式不符合要求、值太大而无法适应刻度溢出以及舍入/截断等问题。您可能会得到意外的结果,MySQL可能会丢失精度和静默缩放,或者抛出异常和/或警告。该行为取决于会话的sql模式设置。

哪个正则表达式不起作用?请举例说明4.40-4.85X3.60不是一个数字。这里的正则表达式不是正确的选择。您最好使用sql字符串函数将列值拆分为三个部分,然后检查这些值是否在范围内…将其拆分为搜索字符串中-和X的位置的部分,以及要检查的三个部分,然后在这三个部分之间..不是更好吗@Ω可能是超级。我只是假设这些数字是定点的,但是如果它们是10或更高呢。好的,我会编辑的。