[英]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小提琴:
這是否涵蓋您的預期結果?
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.