【问题标题】:Extract each value from JSON array as unique row从 JSON 数组中提取每个值作为唯一行
【发布时间】:2020-09-10 00:08:56
【问题描述】:

这是我的 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 presto


【解决方案1】:

这是在 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 服务器

中运行的查询
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'
    )
  )

【讨论】:

    【解决方案2】:

    如果你使用的是 Postgres,你可以使用这个:

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

    【讨论】:

      【解决方案3】:

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

      即:

      var Array_name = Object.keys(object_name);
      

      那么你可以把它当作数组使用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-08
        • 1970-01-01
        • 2021-07-22
        • 2020-08-27
        • 2016-01-25
        • 2020-01-11
        • 1970-01-01
        • 2019-04-30
        相关资源
        最近更新 更多