Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
postgresql一对多作为json结果,如何过滤?_Sql_Postgresql - Fatal编程技术网

postgresql一对多作为json结果,如何过滤?

postgresql一对多作为json结果,如何过滤?,sql,postgresql,Sql,Postgresql,我有一个简单的数据库结构,具有一对多关系 CREATE TABLE customer ( id SERIAL PRIMARY KEY, email TEXT, first_name TEXT, last_name TEXT ); CREATE TABLE customer_addres

我有一个简单的数据库结构,具有一对多关系

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\u name
类似于某个搜索词的所有客户(及其所有地址)。我无法让它工作。当一个地址的街道名称包含某个值(与
ILIKE
匹配)时,如何选择包含所有内联地址的完整记录

我尝试添加:
WHERE customer\u address.street\u name,如“Ro”
,虽然这样做有效,但如果我用完全不同的语句替换WHERE语句,如
WHERE customer.id>0
,我会在结果集中得到双倍的结果

下面是一个sql小提琴游戏:


这是否涵盖了您的预期结果

id |电子邮件|名|姓|地址 -: | :------------ | :--------- | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1 | john@test.com| John | Doe |[{“id”:1,“街道名称”:“路线”,“街道编号”:“222”,“邮政编码”:“9000”,“城市”:“NY”},{“id”:2,“街道名称”:“Ro”,“街道编号”:“444”,“邮政编码”:“9000”,“城市”:“LA”}]
DBFIDLE

这是否涵盖了您的预期结果

id |电子邮件|名|姓|地址 -: | :------------ | :--------- | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1 | john@test.com| John | Doe |[{“id”:1,“街道名称”:“路线”,“街道编号”:“222”,“邮政编码”:“9000”,“城市”:“NY”},{“id”:2,“街道名称”:“Ro”,“街道编号”:“444”,“邮政编码”:“9000”,“城市”:“LA”}]
dbfiddle

此连接条件看起来错误:

JOIN customer_address ON customer_address.id = customer.id
难道不是吗

JOIN customer_address ON customer_address.customer_id = customer.id
这是小提琴:

在对原始答案进行讨论后,以下是解决所提出问题的最终解决方案:


此连接条件看起来不正确:

JOIN customer_address ON customer_address.id = customer.id
难道不是吗

JOIN customer_address ON customer_address.customer_id = customer.id
这是小提琴:

在对原始答案进行讨论后,以下是解决所提出问题的最终解决方案:


看来这是个不错的办法。这确实是正确的,但是现在如果我在没有where子句的情况下运行查询,它会给我提供双记录,即使您有where子句,它也会这样做,如果返回的地址超过1个。同时,如果没有where子句,则不需要最后一次连接。下面是更新的fiddle,它可以使用where子句,也可以不使用where子句!你能在一个单独的回复中发布它吗?或者编辑这个,这样我就可以接受它了?嗯,它看起来有点工作。这确实是正确的,但是现在如果我在没有where子句的情况下运行查询,它会给我提供双记录,即使您有where子句,它也会这样做,如果返回的地址超过1个。同时,如果没有where子句,则不需要最后一次连接。下面是更新的fiddle,它可以使用where子句,也可以不使用where子句!你能在一个单独的回复中发布它吗?或者编辑这个,这样我就可以接受它了?也可以查看我上面的编辑。当将WHERE替换为诸如“customer.id>0”之类的泛型时,就会出现这种情况。它提供了双重结果,也可以看到我在上面所做的编辑。当将WHERE替换为诸如“customer.id>0”之类的泛型时,就会出现这种情况。它给出了双重结果