簡體   English   中英

postgresql作為json結果一對多,如何過濾?

[英]postgresql one to many as json result, how to filter?

我有一個簡單的數據庫結構,具有一對多關系

CREATE TABLE customer (
  id                              SERIAL PRIMARY KEY,
  email                           TEXT,
  first_name                      TEXT,
  last_name                       TEXT
);

CREATE TABLE customer_address (
  id              SERIAL PRIMARY KEY,
  customer_id     INTEGER                NOT NULL,
  street_name     TEXT                   NOT NULL,
  street_number   TEXT                   NOT NULL,
  zip_code        TEXT                   NOT NULL,
  city            TEXT                   NOT NULL
);

對於我的應用程序,我想返回每個客戶及其所有地址為一行,從而將所有地址封裝在一個json數組中。 這樣做是這樣的:

SELECT customer.*, 
       addresses 
FROM   customer 
       left join (SELECT 
Array_to_json(Array_agg( 
Json_build_object('id', address.id, 'street_name', address.street_name, 'street_number', address.street_number, 'zip_code', address.zip_code, 'city', address.city))) AS addresses,
address.customer_id 
AS customer_id 
 FROM   customer_address AS address 
 GROUP  BY address.customer_id) addresses 
       ON addresses.customer_id = customer.id 
join customer_address 
  ON customer_address.customer_id = customer.id 

這可以正常工作,並為我提供了一個結果集,其中每個結果都有一個名為addresses的元素,其中包含所有客戶地址的JSON數組。

現在,我想選擇street_name就像某個搜索詞的所有客戶(及其所有地址)。 而且我無法正常工作。 當一個地址的街道名稱包含某個值(與ILIKE匹配)時,如何選擇包括所有內聯地址的完整記錄?

我嘗試添加: WHERE customer_address.street_name LIKE 'Ro' ,並且這WHERE customer_address.street_name LIKE 'Ro' ,但是,如果我用完全不同的東西(例如WHERE customer.id > 0替換此where語句,則結果集中將有雙

這是一個可在其中玩耍的sql小提琴:

http://sqlfiddle.com/#!17/0e818/4

此連接條件看起來是錯誤的:

JOIN customer_address ON customer_address.id = customer.id

不是嗎

JOIN customer_address ON customer_address.customer_id = customer.id

這是小提琴: http ://sqlfiddle.com/#!17/ 2fff0/6

在討論了原始答案之后,這是解決所提出問題的最終解決方案:

http://sqlfiddle.com/#!17/2fff0/25

這是否涵蓋您的預期結果?

 SELECT customer.*,addresses FROM customer LEFT JOIN (SELECT array_to_json(array_agg(json_build_object('id',address.id,'street_name',address.street_name,'street_number',address.street_number,'zip_code',address.zip_code,'city',address.city))) AS addresses,address.customer_id AS customer_id FROM customer_address AS address GROUP BY address.customer_id) addresses ON addresses.customer_id = customer.id JOIN customer_address ON customer_address.id = customer.id WHERE customer_address.street_name LIKE 'Ro%' 
\n id |  電郵|  first_name |  last_name |  地址                                                                                                                                                                                       \n -:|  :------------ |  :--------- |  :-------- |  :------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------------------------------------\n  1 |  john@test.com |  約翰|  美國能源部  [{“ id”:1,“ street_name”:“ Route”,“ street_number”:“ 222”,“ zip_code”:“ 9000”,“ city”:“ NY”},{“ id”:2,“ street_name “:” Ro“,”街道編號“:” 444“,”郵政編碼“:” 9000“,”城市“:” LA“}]\n

dbfiddle 在這里

暫無
暫無

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

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