Sql 将JSON数组中的每个值提取为唯一行

Sql 将JSON数组中的每个值提取为唯一行,sql,arrays,json,presto,Sql,Arrays,Json,Presto,这是我的问题 %jdbc(presto) select cast(json_extract(basicmetadata, '$.locales') as array<map<varchar, json>>) from escherbird.entities where entityid = 1262415487625019394 and domainid = 124 这个查询给我一个空结果 %jdbc(presto) select

这是我的问题

%jdbc(presto)
select
    cast(json_extract(basicmetadata, '$.locales') as array<map<varchar, json>>)
from 
    escherbird.entities
where
    entityid = 1262415487625019394
    and domainid = 124
这个查询给我一个空结果

%jdbc(presto)
select
    cast(json_extract(basicmetadata, '$.locales.country') as array<map<varchar, json>>)
from 
    escherbird.entities
where
    entityid = 1262415487625019394
    and domainid = 124

如何编写查询以将每个国家作为唯一行返回

这是一种对象类型,若要在表中显示,应将其转换为数组

i、 e:

var Array_name = Object.keys(object_name);

然后您可以将其用作数组

这是在SQL server 2016及更高版本中运行的查询

DECLARE @JSONDATA NVARCHAR(MAX);
    SET 
      @JSONDATA = N'{"domainId":29,"locales":[{"language":"en","country":"IN"},{"language":"en","country":"AU"}]}';
    SELECT 
      COUNTRY 
    FROM 
      OPENJSON(@JSONDATA) WITH (
        LOCALES NVARCHAR(MAX) '$.locales' AS JSON
      ) CROSS APPLY OPENJSON(LOCALES, '$') WITH (
        COUNTRY NVARCHAR(2) '$.country'
      );

以下是在Oracle server中运行的查询


如果您使用的是Postgres,您可以使用:

select c.item ->> 'country' as country
from the_table t
  cross join jsonb_array_elements(t.json_column -> 'locales') as c(item);

请用您正在运行的数据库标记您的问题:mysql、postgresql、oracle。。。?JSON函数高度特定于供应商。请添加用于获取此函数的sql语句。
SELECT 
  * 
FROM 
  JSON_TABLE(
    '{"domainId":29,"locales":[{"language":"en","country":"IN"},{"language":"en","country":"AU"}]}', 
    '$.locales[*]' COLUMNS (
      -- L_ROWNUM FOR ORDINALITY,
      L_COUNTRY VARCHAR2(10) PATH '$.country'
    )
  )
select c.item ->> 'country' as country
from the_table t
  cross join jsonb_array_elements(t.json_column -> 'locales') as c(item);