PostgreSQL正在尝试选择json数组值

PostgreSQL正在尝试选择json数组值,postgresql,Postgresql,我将以下json数组存储在postgres db的一列中。我正在尝试编写一个查询,以按国家/地区名称获取所有行 查询将执行,但无法使其返回任何值 列名为sources,属于json数组类型 示例值 [{ "name": "Albania", "type": "domain", "order": 2 },{ "name": "Samoa", "type": "domain", "order": 3 },{ "name": "United St

我将以下json数组存储在postgres db的一列中。我正在尝试编写一个查询,以按国家/地区名称获取所有行

查询将执行,但无法使其返回任何值

列名为
sources
,属于json数组类型

示例值

[{
    "name": "Albania",
    "type": "domain",
    "order": 2
},{
    "name": "Samoa",
    "type": "domain",
    "order": 3
},{
    "name": "United States",
    "type": "domain",
    "order": 4
}]
以下是我正在尝试运行的查询:

 SELECT * from my_table,
        json_array_elements(sources->'name') elem
            where elem->>'name' = 'Samoa';

尝试使用
EXISTS
和相关子查询

SELECT *
       FROM my_table t
       WHERE EXISTS (SELECT *
                            FROM json_array_elements(t.sources) jae (e)
                            WHERE jae.e->>'name' = 'Samoa');

尝试使用
EXISTS
和相关子查询

SELECT *
       FROM my_table t
       WHERE EXISTS (SELECT *
                            FROM json_array_elements(t.sources) jae (e)
                            WHERE jae.e->>'name' = 'Samoa');

你几乎说对了。问题是您太频繁地指定了一次“name”。源没有名为“name”的顶级键(因为它是一个数组,所以没有字符串键),因此会给出“null”,不能取消设置。因此:

SELECT * from my_table,
        json_array_elements(sources) elem
            where elem->>'name' = 'Samoa';
但是,如果您不需要将包含匹配项的特定元素作为单独的列,那么您可以使用containment操作符来完全删除连接

select * from my_table where sources::jsonb @> '[{"name":"Samoa"}]';

你几乎说对了。问题是您太频繁地指定了一次“name”。源没有名为“name”的顶级键(因为它是一个数组,所以没有字符串键),因此会给出“null”,不能取消设置。因此:

SELECT * from my_table,
        json_array_elements(sources) elem
            where elem->>'name' = 'Samoa';
但是,如果您不需要将包含匹配项的特定元素作为单独的列,那么您可以使用containment操作符来完全删除连接

select * from my_table where sources::jsonb @> '[{"name":"Samoa"}]';