以下是我的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 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'
)
)
如果你使用Postgres,你可以使用这个。
select c.item ->> 'country' as country
from the_table t
cross join jsonb_array_elements(t.json_column -> 'locales') as c(item);
这是一个对象类型,你应该把它转换为一个数组 如果你想在表上显示这个。
即
var Array_name = Object.keys(object_name);
那你就可以用这个作为数组