在PostgreSQL中根据单独的表数据执行搜索

时间:2017-12-05 19:07:25

标签: postgresql

我有一张看起来像这样的表:

deals
id     vendorid     name
1      52           '25% Off'
2      34           '10% Off'

-

vendors
id     name
52     'Walmart'
34     'Home Depot'

我正在尝试搜索同时根据供应商ID进行搜索的数据库。

我能够在查询中获取供应商数据:

SELECT *,
(SELECT json_agg(vendors.*) FROM vendors WHERE deals.vendorid = vendors.id) as vendor
FROM deals

现在我想添加一个搜索,这是我尝试过的东西

SELECT *,
(SELECT json_agg(vendors.*) FROM vendors WHERE deals.vendorid = vendors.id) as vendor
FROM deals
WHERE vendor.name ILIKE '%wal%'

在上面的示例中,用户将开始搜索walmart,但是它表示vendor.name列不存在,执行此操作的正确方法是什么?

我期望从上述查询获得的输出是:

[
 {
   id: 1,
   vendorid: 52,
   name: '25% Off',
   vendor: [
      {
        id: 52,
        name: 'Walmart'
      }
   ]
 }
]

2 个答案:

答案 0 :(得分:2)

我能够通过使用它来完成它。

SELECT 
      *,
      (SELECT json_agg(vendors.*) FROM vendors WHERE deals.vendorid = vendors.id) as vendor
    FROM 
      deals
    where (SELECT json_agg(vendors.*) FROM vendors WHERE deals.vendorid = vendors.id).name ILIKE '%wal%'

它非常难看,但完成了工作。我对postgree并不熟悉,但你可以以某种方式将它存储在一个变量中。

答案 1 :(得分:1)

您需要的查询

drop table if exists deals;
drop table if exists vendors;

create table if not exists deals(
  id serial, 
  vendorid int not null, 
  name varchar not null
); 

create table if not exists vendors(
  id serial,
  name varchar not null
);

insert into deals values 
(1,52,'25% off'), 
(2,34,'10% off');

insert into vendors values 
(52,'Walmart'),
(34,'Home Depot');


select 
    d.id,
    d.vendorid,
    v.name,
    json_agg(v.*)
from 
    vendors v 
left join 
    deals d on d.vendorid = v.id
where 
    --v.id=52 and
    v.name ILIKE '%wal%'
group by 
    d.id,
    d.vendorid,
    v.name;

如果您运行的是9.3+版本的postgres,则可以使用postgres提供的强大功能:the full text search

检查其工作原理here

享受postgres的力量。