Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql:对已创建的列进行筛选_Sql_Postgresql - Fatal编程技术网

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

假设我有一个非常简单的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
但我得到了以下错误:

错误:“新建”列不存在


其中
是在
选择
之前处理的,这就是为什么计算列
新建
在当时是未知的。改用
步骤*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')
)。是否有一种更简单的方法可以在不重复操作代码的情况下执行此操作?