sql:对已创建的列进行筛选
假设我有一个非常简单的sql表:sql:对已创建的列进行筛选,sql,postgresql,Sql,Postgresql,假设我有一个非常简单的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 n
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
但我得到了以下错误:
错误:“新建”列不存在
其中
是在选择
之前处理的,这就是为什么计算列新建
在当时是未知的。改用步骤*10=20
或者使用别名的子查询和筛选器
select *
from (select id, step, jsonb_array_elements(payload::jsonb->'sample_id') as new
from event
) e
where new = --somevalue
其中
是在选择
之前处理的,这就是为什么计算列新建
在当时是未知的。改用步骤*10=20
或者使用别名的子查询和筛选器
select *
from (select id, step, jsonb_array_elements(payload::jsonb->'sample_id') as new
from event
) e
where new = --somevalue
如果不喜欢子查询,可以使用横向联接:
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
子句中即可。如果不喜欢子查询,可以使用横向联接:
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
子句中。尝试选择id,step,step*10作为新的FROM事件,其中step*10=20,因为where子句不会识别字段别名。由于您的示例很简单,如果您的表很大,基于函数的索引将对您有很大帮助。我意识到这是离题的,但希望有帮助。请尝试从事件中选择id、步骤、步骤*10作为新的,其中步骤*10=20,因为where子句将无法识别字段别名。由于您的示例很简单,如果您的表很大,则基于函数的索引将对您有很大帮助。我意识到这是离题的,但希望有帮助。new
实际上是一个更复杂的操作(jsonb\u数组\u元素(payload::jsonb->'sample\u id')
)。有没有一种更简单的方法可以在不重复操作代码的情况下执行此操作?new
实际上是一个更复杂的操作(jsonb\u数组\u元素(payload::jsonb->'sample\u id')
)。是否有一种更简单的方法可以在不重复操作代码的情况下执行此操作?