【问题标题】:How to use a JSON subquery in a MySQL JSON Statement如何在 MySQL JSON 语句中使用 JSON 子查询
【发布时间】:2020-07-12 08:15:47
【问题描述】:

以下场景:我的 sql 表中有一个名为“address”的 JSON 数据列。我在其中插入了一组对象。稍后我将需要通过找出请求中的哪个type 将被传递来选择数组的整个对象。 因此,如果我将{ "type": "shipping" } 传递给我的 REST API,我想获取对象中标记为“shipping”类型的所有数据。

只是我尝试过的不同 JSON 格式之一:

{
    "address": [
        {
            "type": "shipping",
            "street": "streetName",
            "streetNumber": "1"
        },
        {
            "type": "billing",
            "street": "streetName",
            "streetNumber": "2"
        },
        {
            "type": "custom",
            "street": "streetName",
            "streetNumber": "3"
        }
    ]
}

这就是数据存储在单列中的方式:

[
{"type": "custom", "street": "streetName", "streetNumber": "1"}, 
{"type": "shipping", "street": "streetName", "streetNumber": "2"}, 
{"type": "billing", "street": "streetName", "streetNumber": "3"}
]

所以我尝试用 MySQL 的 JSON 函数来做一些魔术。类似的查询

SELECT JSON_SEARCH(address, 'one', 'shipping')
FROM user_data;

工作得很好,但这不是我需要的结果。所以我想到了使用子查询

SELECT JSON_EXTRACT(address, (SELECT JSON_SEARCH(address, 'one', 'shipping')))
FROM user_data
WHERE user_id = 1;

但这只会以“无效的 JSON 路径表达式”结束(错误代码:3143)。 我已经尝试过使用不同的查询和 JSON 数据格式,例如使用数组我尝试插入数据,例如

"address": {
    "shipping": {
        "street": ...
        .
     },
    "billing": {
        "street": ...
        .
    }
}

现在我只是感到困惑,似乎只有 mysql 文档现在没有帮助......

【问题讨论】:

  • 为什么要使用 JSON 作为地址,而不是创建第二个表 Addresses,其中包含 typestreetstreetNumber 等的普通列?然后你可以在Addresses表中每行存储一个地址,并且很容易找到它。
  • 我想建立一个CRM系统,存储客户数据的客户应该能够为客户添加任意​​数量的地址。所以也许他最终有 10000 个客户,每个客户可能有 2-5 个地址。由于可扩展性和性能问题,我想防止有数以千计的行......但如果数据的数量不会影响这一点,我也可以做一个单独的表。 (联系数据、个人数据等也是如此……我还想防止有数千张表)
  • + 每个客户都可能有其他要求...也许有人需要另外 10 列...编辑此表将比使用简单的文档对象更工作(我猜)
  • 但正如您所发现的,搜索 JSON 数据几乎是不可能的。它至少要复杂得多。
  • 伤心......这本可以让我的生活变得更轻松。好吧,那我会坚持你的提议。谢谢!

标签: mysql sql json


【解决方案1】:

您的查询生成无效的 JSON 路径表达式,因为结果包含引号

SELECT JSON_SEARCH(address, 'one', 'shipping')
FROM user_data;

Result: "$[0].type"

你可以用 REPLACE 函数去掉那些引号

SELECT REPLACE( JSON_SEARCH(address, 'one', 'shipping'), '"', '')
FROM user_data;

Result: $[0].type

要获取对象路径,您还应该替换结果末尾的“.type”

SELECT REPLACE(REPLACE( JSON_SEARCH(address, 'one', 'shipping'), '"', ''), '.type', '')
FROM user_data;


Result: $[0]

最终查询如下所示:

SELECT 
JSON_EXTRACT(
    address,
    REPLACE(
        REPLACE(
            (SELECT JSON_SEARCH(address, 'one', 'billing') FROM user_data), 
            '"', 
            '' ), 
        '.type', 
        '')
) 
FROM user_data 
WHERE user_id = 1;

此处示例:https://www.db-fiddle.com/f/mYBXEs3M4xFDGeQvGwUgqQ/0

【讨论】:

    猜你喜欢
    • 2015-11-18
    • 2021-05-26
    • 2021-04-08
    • 2010-11-17
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    相关资源
    最近更新 更多