如何在一个 json 对象中查询多行

How to query multiplte row in one json object

table 提供商

table provider_properties

我想要这样的结果

{
  "provider_uuid": "b897f790-ee90-4869-9345-690380b1a0c9",
  "name": "Provider 1",
  "password": "112233",
  "username": "provider_1",
  "properties": {
    "address_1": "Dubai",
    "address_2": "NY"
  }
}

这里我尝试了类似

的东西
SELECT provider.*, json_object(provider_properties.key_name, provider_properties.key_value) as properties FROM provider JOIN provider_properties on provider.provider_id = provider_properties.provider_uuid;

但问题是我得到了 2 行

由于您的预期结果需要 json 中的特定格式。你想参考 JSON Formatted output。不过这是给 shell 的。

您可能还想试试这个...

这会给你一个表格结果,但在一行中。

SELECT 
    provider.*, 
    p_props.properties 
FROM provider 
JOIN (
    provider_uuid,
    SELECT JSON_OBJECTAGG(
        provider_properties.key_name,
        provider_properties.key_value
    ) as properties
    FROM provider_properties 
    GROUP BY provider_uuid
) p_props ON provider.provider_id = p_props.provider_uuid;
    这里的
  1. CONCAT()REPLACE()是用来对列进行排序的
  2. 我想说这里使用REPLACE()是有风险的,请测试一下,看看如何。

db<>fiddle

SELECT 
    p.*,
    CONCAT(
        '{"', 'provider_uuid": "', pp.provider_uuid, '"',
        REPLACE(JSON_OBJECT('name', p.name, 'password', p.password, 
                            'username', p.username, 'properties', pp.name_value), '{"name', ', "name')
    ) AS your_json
FROM provider p
JOIN (
    SELECT provider_uuid, JSON_OBJECTAGG(key_name, key_value) as name_value
    FROM provider_properties 
    GROUP BY provider_uuid
) pp ON p.provider_id = pp.provider_uuid;