Postgres 9.5 查询匹配数组中的 JSON 属性

Postgres 9.5 Query matching JSON Property within Array

我有一个列 address,类型 jsonb[],在 table Houses 中,其中包含一个数组像这样:

"{
  "{\"zip\": \"13203-1807\", 
  \"city\": \"\SYRACUSE\", 
  \"state\": \"NEW YORK\", 
  \"street\": \"9 PROSPECT AVENUE\"}"
 }"

我正在尝试查询地址城市为 "Syracuse" 的所有房屋;到目前为止我有:

SELECT * FROM Houses WHERE address -> 'city' = 'SYRACUSE'

并收到此错误:

No operator matches the given name and argument type(s). You might need to add explicit type casts.

我查看了 PG Official Documentation on JSON Functions and Operators 以及几个 Whosebug 答案,但都无济于事。

好的,正如上面评论中提到的,您正试图在 postgresql 数组上使用 JSON 运算符,这就是您收到类型错误的原因。有几种方法可以解决这个问题,具体取决于您实际想要在该字段中存储的内容。

对于这些示例,我将假设以下内容 table:

CREATE TABLE houses (id INT, address <some datatype>);

如果你想让它成为 jsonb 的 postgres 数组,你必须解压数组,你可以这样做:

WITH all_addresses AS (
  SELECT id, unnest(address) as add
    FROM houses)
SELECT *
  FROM houses h
  WHERE
    id IN (SELECT id
             FROM all_addresses
             WHERE add->'city' = to_jsonb('SYRACUSE'::text));

另一方面,如果您想使用 JSON 数组,则查询可能如下所示(非常相似,因为您仍然需要取消嵌套数组):

WITH all_addresses AS (
  SELECT id, jsonb_array_elements(address) as add
    FROM houses)
SELECT *
  FROM houses h
  WHERE
    id IN (SELECT id
             FROM all_addresses
             WHERE add->'city' = to_jsonb('SYRACUSE'::text));

我不能完全从你的问题中看出,但有可能你在该列中每行只存储一个地址(基于你的示例数据和该列被命名为 'address',而不是 'addresses')。如果是这样,您的查询就会变得简单得多:

SELECT *
  FROM houses
  WHERE address->'city' = to_jsonb('SYRACUSE'::text);