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

时间:2016-06-17 07:49:46

标签: mysql regex

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

9
49
5,9
4,94
5,8,89,32

我需要在这些中找到数字9,所以我想要的唯一结果是

9
5,9

我尝试过使用REGEX,但无法正确使用。有人能指出我正确的方向吗?这是迄今为止的查询

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

我意识到在我想要的数字之前或之后可能有或可能没有逗号。

3 个答案:

答案 0 :(得分:2)

试试这个;)

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 FIND_IN_SET('9', a.city) > 0

如果a.city并非全部用逗号,分隔,我认为REGEXP会更合适,就像@WiktorStribiżew给出的答案一样。

答案 1 :(得分:2)

我认为您错过了LIKE的一种可能情况:如果9出现在条目的中间中。所以,添加

OR a.city LIKE CONCAT('%,', b.city, ',%')

如果您想使用正则表达式,请尝试

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

其中[[:<:]]是前导词,[[:>:]]是尾随词边界。但是,在这种简单的情况下,你可以不使用REGEXP并使用LIKE,因为MySQL中的REGEXP相当耗费资源。

答案 2 :(得分:1)

有一个MySQL内置函数,FIND_IN_SET可以满足您的需求。

它返回第二个参数中第一个参数的从1开始的索引,其中第二个参数是逗号分隔的字符串。如果第二个参数根本不存在,则返回my_matrix = [[1 2 3 4 5 6]]?

0

由于MySQL将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 视为0,将任何非FALSE号视为0,因此您可以在TRUE子句或WHERE中使用它{1}}。

JOIN

但有several reasons为什么存储像这样的逗号分隔列表是一个坏主意。对于旅游和城市的每个组合,您应该更喜欢一个单独的表格。