重用子查询进行过滤

时间:2017-06-20 22:53:34

标签: sql postgresql

假设我有一个函数set_size(),它接受​​一个jsonb并返回该对象的大小。另外,我可以保证任何json对象只被包含在另一个json对象中,并且我有一个函数is_superset(jsonb, jsonb),如果前者是后者的父节点则返回true,否则返回false。

说我现在有这样的事情:

SELECT id, CASE WHEN size = 0
  THEN SELECT (set_size(container.set)) size
  FROM my_table container
  WHERE is_superset(container.set, initial.set)
  ELSE size
FROM (SELECT set_size(initial.set) size FROM my_table) initial
WHERE initial.id != container.id

这导致missing FROM-clause entry for table "container"

如何重用这样的子查询结果?实现这一结果的合理方法是什么? (例如过滤掉原始选择)

编辑:表格结构:

 set                  | id
------------------------------------------
 {}                   | 1                  --size 0
 {a: {}}              | 2                  --size 1, 'contains' first set
 {b: {c: {a: 5}}      | 3                  --size 3

预期结果:

id           | size
------------------------
1            | 2
3            | 3

请注意,我知道这并不像jsonb查询那样有很大意义,并且寻找帮助找到正确的jsonb操作。真正的问题涉及postgis,几何和ST_Area / ST_Contains。但是这个问题以更一般的方式展示了我所遇到的关系问题。

0 个答案:

没有答案