假设我有一个非常简单的sql表:
id | step
----+------
1 | 1
2 | 2
3 | 3
我试图基于一个简单的操作创建一个新列,并对该新列进行过滤。过滤器之前的新创建的表格应如下所示:
id | step | new
----+------+-----
1 | 1 | 10
2 | 2 | 20
3 | 3 | 30
我认为以下查询应该有效:
select id, step, step*10 as new from event where new = 20
但是我遇到以下错误:
错误:“新”列不存在
答案 0 :(得分:2)
where
在select
之前处理,这就是为什么此时未知计算列new
的原因。请改用step*10=20
。
或者使用子查询并使用别名进行过滤。
select *
from (select id, step, jsonb_array_elements(payload::jsonb->'sample_id') as new
from event
) e
where new = --somevalue
答案 1 :(得分:0)
如果您不喜欢子查询,则可以使用横向联接:
with event as (
select 1 as id, 2 as step
)
select e.id, e.step, v.new
from event e cross join lateral
(values (e.step * 10)) v(new)
where v.new = 20;
当您有多个相互依赖的表达式时,这很方便。除了嵌套子查询或CTE,您还可以将它们添加到FROM
子句中。