【问题标题】:MYSQL JSON search returns results in square bracketsMYSQL JSON 搜索返回方括号中的结果
【发布时间】:2021-10-27 12:00:23
【问题描述】:

我正在对 MySQL 数据库中保存的 JSON 进行简单搜索,但返回的结果用方括号和引号括起来。

SELECT stored_json->>'$.*.referal' AS referal FROM table WHERE id =  100

结果

+------------+
| referal    |
+------------+
| ["search"] |
+------------+

有没有办法让MYSQL返回不带括号和引号的结果?

+------------+
| referal    |
+------------+
| search     |
+------------+

谢谢

编辑

JSON 示例

{
    "100": {
            "referal": "search"
    }
}

【问题讨论】:

  • 您的 JSON 路径从您的 JSON 文档返回一个数组。它碰巧只保存一个值,但它仍然是一个数组。 Edit 您的问题是向我们展示相关文档(您的 stored_json 列的值),我们或许可以帮助您更改提取第一个数组元素的路径。

标签: mysql mysql-json


【解决方案1】:

如果您只想要数组中的单个值,则提取该值并取消引用它:

SELECT JSON_UNQUOTE(JSON_EXTRACT(
    JSON_EXTRACT(stored_json, '$.*.referal'), '$[0]')) AS referal
FROM ...

+---------+
| referal |
+---------+
| search  |
+---------+

JSON_UNQUOTE() 函数将结果转换为字符串,但是如果你给它一个 JSON 数组或对象,它就不能去掉括号和双引号。那些只是成为字符串的一部分。您必须从 JSON 中提取单个标量值,然后您可以使用 JSON_UNQUOTE() 删除双引号。

如果您的 JSON 文档中有多个值,我想您可能希望获得结果。

+----------------------------+
| referal                    |
+----------------------------+
| ["search","word of mouth"] |
+----------------------------+

抱歉,我没有找到解决方案,除了:

REPLACE(..., '[', '')

以此类推,删除你不想要的其他字符。

在 MySQL 8.0 中,函数 REGEXP_REPLACE() 可以一次删除多个字符:

REGEXP_REPLACE(..., '["\\[\\]]', '')

【讨论】:

  • 太好了,谢谢。为了简洁起见,我稍微调整了一下以使用 stored_json->>'$.*.referal' 而不是 JSON_EXTRACT(stored_json, '$.*.referal') 但基本相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 2011-09-22
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多