簡體   English   中英

數組內的Postgres 9.5查詢匹配的JSON屬性

[英]Postgres 9.5 Query matching JSON Property within Array

我在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.

我瀏覽了有關JSON函數和運算符的PG官方文檔,以及一些徒勞無功的StackOverflow答案。

好的,正如上面的評論中所提到的,您試圖在PostgreSQL數組上使用JSON運算符,這就是為什么您遇到類型錯誤的原因。 您有幾種方法可以解決此問題,具體取決於您實際希望在該字段中存儲的內容。

對於這些示例,我將假設下表:

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

如果希望它是jsonb的postgres數組, jsonb必須解壓縮該數組,您可以這樣做:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM