【问题标题】:MySQL REGEXP + whitespace (\s)MySQL REGEXP + 空格 (\s)
【发布时间】:2013-03-11 14:11:25
【问题描述】:

我使用的数据库以 LONGTEXT 数据类型存储 JSON 条目。我希望能够根据 JSON 数据选择条目。以下是一些示例数据:

 {
    "12f9cb0a-2218-4590-a05d-c1ffab00f693":  {
        "0":  {
            "value": "test"
        }
    },
    "4d1dfd2e-7bc1-4303-9c8c-90856e918bb9":  {
        "item":  {
            "0": "11"
        }
    }
 }

所以我想通过过滤掉空格来选择包含 "4d1dfd2e-7bc1-4303-9c8c-90856e918bb9": { "item": { "0":"11" } } 的数据(制表符、空格、换行符)使用 REGEXP 函数,我试过这个没有用:

SELECT * FROM my_table WHERE (elements REGEXP BINARY '"4d1dfd2e-7bc1-4303-9c8c-90856e918bb9":\s*{\s*"item":\s*{\s*"0":\s*"11"\s*}\s*}');

正则表达式测试使用 Rubular 和 Regexpal.com 工作,但 MYSQL 似乎不喜欢 \s* 表达式。有没有人对此有更好的解决方案?

【问题讨论】:

    标签: mysql regex json


    【解决方案1】:

    在 MySQL 8.0 之前,MySQL 正则表达式仅支持 §12.7.2 "Regular Expressions" of the MySQL 5.7 Reference Manual 中列出的符号(或相应版本的对应符号),其中包括 [[:space:]] 符号,但不支持 \s 符号。因此,您只需将每次出现的\s 替换为[[:space:]]

    在 MySQL 8.0 及更高版本中,MySQL 使用 Unicode [link] 国际组件的正则表达式支持,其中确实包括 \s [link];但由于 MySQL 本身使用\ 作为字符串中的转义字符,因此您需要将反斜杠加倍,将每次出现的\s 替换为\\s

    【讨论】:

    • 谢谢。是否有处理制表符、空格和换行符的 C 转义序列? (\s 的替代品)
    • 重新阅读,查询仍然没有返回任何内容:(。它从 '"4d1dfd2e-7bc1-4303-9c8c-90856e918bb9":\\s*'... '"4d1dfd2e-7bc1 -4303-9c8c-90856e918bb9":\\s*{' 不起作用
    • 我用谷歌搜索了一下,发现您可以使用 {{ 转义大括号,但这仍然不起作用。
    • @TommyPlummer:'"4d1dfd2e-7bc1-4303-9c8c-90856e918bb9":[[:space:]]*\\{' 工作得更好吗?
    • 太棒了,它现在可以工作了!我将正则表达式字符串更改为 "4d1dfd2e-7bc1-4303-9c8c-90856e918bb9":[[:space:]]*{[[:space:]]*"item": {[[:space:]] *"0": "11"[[:space:]]*}[[:space:]]*} 成功拉表。大括号似乎不需要 \\ 转义字符(它似乎实际上破坏了查询)。再次感谢!
    【解决方案2】:

    使用字符串替换;

    select replace(json, ' ','') from table;
    

    如果您的数据中有空格,这将不起作用。

    【讨论】:

    • 在您添加查询后,ruakh 发布了一个很好的答案。读他的。
    【解决方案3】:

    最好使用json类型: SELECT CAST(`column` AS JSON) WHERE JSON_EXTRACT(CAST(`column` as JSON),'$."4d1dfd2e-7bc1-4303-9c8c-90856e918bb9".item."0"')="11"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 1970-01-01
      • 2022-06-10
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多