18

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

 {
    "12f9cb0a-2218-4590-a05d-c1ffab00f693":  {
        "0":  {
            "value": "test"
        }
    },
    "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*表达式。有没有人对此有更好的解决方案?

4

3 回答 3

46

在 MySQL 8.0 之前,MySQL 正则表达式仅支持MySQL 5.7 参考手册的第 12.7.2 节“正则表达式”中列出的符号(或相应版本的对应物),其中包含[[:space:]]符号但不包含\s符号。因此,您只需要将每次出现的地方替换\s[[:space:]].

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

于 2013-03-21T21:15:25.110 回答
0

使用字符串替换;

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

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

于 2013-03-21T21:16:00.597 回答
0

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

于 2017-03-21T13:52:07.347 回答