PostgreSQL选择何时在另一个表字符串中搜索参数

时间:2015-10-12 15:20:13

标签: sql postgresql

我有这个结构

10 loops, best of 3: 96.7 ms per loop

我有一些搜索参数:'深度'名称'水'等等

如何使用动态参数构建查询?例如,我想找到参数Depth>的点。 4,水是真的'

我认为应该是

%%timeit
df2 = dflarge.reset_index()
res = df2[df2['A']==df2['B']]
res.set_index(['A', 'B', 'C'], inplace=True)

如果我需要更多过滤器,它会变得笨重。

http://sqlfiddle.com/#!15/42ad2

谢谢!

1 个答案:

答案 0 :(得分:0)

此解决方案使用Postgres 9.4中引入的函数json_object_agg(name, value)

您可以使用此查询以json格式显示点参数:

select pnt_id, pnt_name, json_object_agg(prm_name::text, value) params
from points
join points_parameters using(pnt_id)
join parameters using (prm_id)
group by 1, 2

 pnt_id | pnt_name |                         params                         
--------+----------+--------------------------------------------------------
      1 | first    | { "Depth" : "10", "Water" : "true", "Crane" : "true" }
(1 row) 

因此,使用json格式使用任意参数集过滤数据:

select pnt_id, pnt_name
from (
    select pnt_id, pnt_name, json_object_agg(prm_name::text, value) params
    from points
    join points_parameters using(pnt_id)
    join parameters using (prm_id)
    group by 1, 2
    ) s
where (params->>'Depth')::int > 4
and (params->>'Water')::boolean

 pnt_id | pnt_name 
--------+----------
      1 | first
(1 row)