【问题标题】:MYSQL - Match/Find a number in a stringMYSQL - 匹配/查找字符串中的数字
【发布时间】:2016-06-17 16:17:15
【问题描述】:

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

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

我知道在我想要的数字之前或之后可能总是有逗号,也可能不总是逗号。

【问题讨论】:

  • 为什么不使用WHERE a.city LIKE '9,%' OR a.city LIKE '%,9,%' OR a.city LIKE '%,9'?否则,我猜你可能会使用WHERE a.city REGEXP '[[:<:]]9[[:>:]]'我尝试过使用 REGEX,但无法正确使用。 - 你尝试了什么正则表达式?
  • 你真的应该考虑properly normalising that table

标签: mysql regex


【解决方案1】:

我认为您错过了 LIKE 的 1 个可能场景:如果 9 出现在条目的中间。所以,添加

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

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

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

其中[[:&lt;:]] 是前导,[[:&gt;:]] 是尾随字边界。但是,在这种简单的情况下,您可以不使用 REGEXP 而使用LIKE,因为 MySQL 中的 REGEXP 相当消耗资源。

【讨论】:

    【解决方案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 会更可取,就像@Wiktor Stribiżew 给出的答案一样。

    【讨论】:

      【解决方案3】:

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

      它返回第二个参数中第一个参数的从 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)
      

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

      【讨论】:

      • 非常感谢马特。由于您花费了额外的长度,我将您的答案标记为正确答案。我也喜欢那个问题的操作,因为它更简单,但我会在未来尽可能地标准化表格。
      猜你喜欢
      • 1970-01-01
      • 2012-08-30
      • 2018-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 2022-10-14
      相关资源
      最近更新 更多