【问题标题】:Postgres 9.5 Query matching JSON Property within ArrayPostgres 9.5 查询匹配数组中的 JSON 属性
【发布时间】:2016-07-21 17:16:59
【问题描述】:

我有一个列address,在表Houses 中输入jsonb[],其中包含一个看起来像这样的数组:

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

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

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 以及几个 StackOverflow 的答案都无济于事。

【问题讨论】:

  • 您的列类型是jsonb 还是jsonb[]-> 运算符将与前者一起使用,但后者是一个 postgresql 数组,需要数组运算符。
  • jsonb[]@jmelesky
  • 出于好奇,为什么? JSON 已经可以保存数组,所以我不清楚为什么要在 JSON 对象的 JSON 数组上存储 JSON 对象的 postgresql 数组。
  • 没有理由。可以更轻松地查询 JSON 对象的 JSON 数组吗?

标签: sql arrays json postgresql postgresql-9.5


【解决方案1】:

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

对于这些示例,我将假设下表:

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

我无法从您的问题中完全看出,但您可能只在该列中的每行存储一个地址(基于您的示例数据以及该列名为“地址”而不是“地址”)。如果是这种情况,您的查询将变得更加简单:

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

【讨论】:

    猜你喜欢
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 2021-12-22
    • 2016-06-05
    • 1970-01-01
    • 2015-11-28
    相关资源
    最近更新 更多