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)