Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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
MYSQL-匹配/查找字符串中的数字_Mysql_Regex - Fatal编程技术网

MYSQL-匹配/查找字符串中的数字

MYSQL-匹配/查找字符串中的数字,mysql,regex,Mysql,Regex,我需要从一列中找到一个特定的数字,比如我在表tours中查找数字9,表中有一列city。列city有一个数字字符串,如 9 49 5,9 4,94 5,8,89,32 我需要找到其中的数字9,这样我想要的唯一结果就是 9 5,9 我试过使用正则表达式,但没有正确使用。谁能给我指一下正确的方向吗?这是到目前为止的问题 SELECT a.title, a.tourprice, a.city, b.city AS destCity FROM tours a RIG

我需要从一列中找到一个特定的数字,比如我在表
tours
中查找数字
9
,表中有一列
city
。列
city
有一个数字字符串,如

9
49
5,9
4,94
5,8,89,32
我需要找到其中的数字9,这样我想要的唯一结果就是

9
5,9
我试过使用正则表达式,但没有正确使用。谁能给我指一下正确的方向吗?这是到目前为止的问题

SELECT 
    a.title, a.tourprice, a.city, b.city AS destCity
FROM
    tours a
        RIGHT JOIN
    (SELECT 
        id, city
    FROM
        destinations
    WHERE
        id = 47) b ON a.city LIKE CONCAT('%,', b.city) OR a.city LIKE CONCAT(b.city, ',%') //b.city evaluates to 9
我意识到我想要的数字前后可能有逗号,也可能不总是有逗号。

试试这个;)


如果<代码> A.城市< /代码>不被逗号>代码> <代码> >,我认为<代码> ReXEP < /C> >将更为可取,就像Wikter StdiBi EW所给出的答案。

我想你错过了1个可能的场景,比如< <代码> > >如果在代码的中间出现“<代码> 9 < /代码>”。所以,加上

OR a.city LIKE CONCAT('%,', b.city, ',%')
如果你想试试正则表达式,试试吧

WHERE a.city REGEXP CONCAT('[[:<:]]', b.city, '[[:>:]]')
其中a.city REGEXP CONCAT(“[[::]]”)

其中
[[[::]]
是一个尾随单词边界。但是,在这样一个简单的情况下,您可以不使用REGEXP而像使用一样使用,因为MySQL中的REGEXP非常消耗资源。

有一个MySQL内置函数,它可以满足您的需要

它返回第二个参数中第一个参数的基于1的索引,其中第二个参数是逗号分隔的字符串。如果第一个参数在第二个参数中根本不存在,它将返回
0

SELECT FIND_IN_SET(9, '9');           -- 1
SELECT FIND_IN_SET(9, '49');          -- 0
SELECT FIND_IN_SET(9, '5,9');         -- 2
SELECT FIND_IN_SET(9, '4,94');        -- 0
SELECT FIND_IN_SET(9, '5,8,89,32');   -- 0
SELECT FIND_IN_SET(9, '5,8,89,9,32'); -- 4
由于MySQL将
0
视为
FALSE
,将任何非
0
数字视为
TRUE
,因此您可以在
WHERE
子句或
JOIN
中使用它

RIGHT JOIN ... ON FIND_IN_SET(b.city, a.city)

但这就是为什么像这样存储逗号分隔的列表是个坏主意。对于tour和city的每一种组合,您应该更喜欢一个单独的表,表中有一行。

为什么不使用
,其中像'9,%'这样的.city或像''%9,%'这样的.city或像''%9',9'这样的.city
?否则,我想您可以使用
WHERE a.city REGEXP'[[[::]]'
。我尝试过使用正则表达式,但无法正确使用。-你试过什么正则表达式?你应该好好想想。多谢马特。我把你的答案标记为正确答案,因为你的答案太长了。我也喜欢这个问题的op这样做,因为它更简单,但我将在将来尽可能地规范化这些表。
RIGHT JOIN ... ON FIND_IN_SET(b.city, a.city)