从JSON数组中提取每个值作为唯一的行。

问题描述 投票:0回答:1

以下是我的Presto查询

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

它返回这个数组

[{country="IN", hashCode=1828207720, _passthroughFields={}, language="en"}, {country="AU", hashCode=1899888409, _passthroughFields={}, language="en"}, {country="GB", hashCode=-2002878675, _passthroughFields={}, language="en"}, {country="IE", hashCode=-358794848, _passthroughFields={}, language="en"}, {country="CA", hashCode=392726027, _passthroughFields={}, language="en"}, {country="NZ", hashCode=-136386876, _passthroughFields={}, language="en"}, {country="US", hashCode=-1355251774, _passthroughFields={}, language="en"}]

这个查询给我一个空的结果

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

我如何写一个查询,以返回每个国家作为一个独特的行?

sql arrays json
1个回答
0
投票

下面是运行在 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'
      );

以下是运行在 甲骨文服务器

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'
    )
  )

0
投票

如果你使用Postgres,你可以使用这个。

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

-1
投票

这是一个对象类型,你应该把它转换为一个数组 如果你想在表上显示这个。

var Array_name = Object.keys(object_name);

那你就可以用这个作为数组

© www.soinside.com 2019 - 2024. All rights reserved.