SQL使用中间结果

SQL使用中间结果,sql,postgresql,Sql,Postgresql,我有一个带有数字(float)的列,我想将其分类并存储为整数和标签(string)。现在假设类别仅由楼层(x)定义 这项工作: SELECT salary, FLOOR(salary) AS category_integer, CASE WHEN FLOOR(salary) = 0 THEN 'foo' ELSE 'bar' END AS category_label FROM test01 但我想知道是否可以在后面的部分中使用查询开始时定义的中间变量“catego

我有一个带有数字(float)的列,我想将其分类并存储为整数和标签(string)。现在假设类别仅由楼层(x)定义

这项工作:

SELECT salary,
  FLOOR(salary) AS category_integer,
  CASE WHEN FLOOR(salary) = 0
    THEN 'foo'
    ELSE 'bar'
  END AS category_label
FROM test01
但我想知道是否可以在后面的部分中使用查询开始时定义的中间变量“category_integer”,类似这样:

SELECT salary,
  FLOOR(salary) AS category_integer,
  CASE WHEN category_integer = 0
    THEN 'foo'
    ELSE 'bar'
  END AS category_label
FROM test01
但SQL显然不是这样工作的。我研究过常用的表格表达,但在那里迷失了方向。有没有办法在SQL表达式中重用中间变量


我一定错过了这个,但到目前为止我还没有找到相关的问题

您可以求助于公共表表达式—基本上是一个查询,它生成一个可在后续查询中引用的带标签的结果集

根据您的示例进行调整:

with cte as (
    select salary
         , floor(salary) as category_integer 
      from test01
)
SELECT salary
     , category_integer
     , CASE WHEN category_integer = 0
          THEN 'foo'
          ELSE 'bar'
       END AS category_label
 FROM cte
    ;
有关更多详细信息,请参阅参考:


请参见中的“工作时使用”。

您可以使用通用表表达式-基本上是一个查询,它生成一个可在后续查询中引用的带标签的结果集

根据您的示例进行调整:

with cte as (
    select salary
         , floor(salary) as category_integer 
      from test01
)
SELECT salary
     , category_integer
     , CASE WHEN category_integer = 0
          THEN 'foo'
          ELSE 'bar'
       END AS category_label
 FROM cte
    ;
有关更多详细信息,请参阅参考:


请参见中的“工作中的it”。

有选择前和选择后操作。例如,
order by
group by
是选择后的指令,例如,
distinct
在选择过程中过滤掉重复的结果,因此重复的结果甚至不进入要排序或分组的结果集

当您将
用作
时,您告诉PostgreSQL获取结果并将其放入输出中名为
category\u integer
的列中。您实际上并没有在这里创建一个在查询执行期间可用的变量,因为结果只有在查询执行之后才可用。因此,您只能使用Subselect来执行此操作,其中,
category\u integer
是表中的一列,而不是一个变量

SELECT category_integer,
  CASE WHEN category_integer = 0
    THEN 'foo'
    ELSE 'bar'
  END AS category_label
FROM (SELECT FLOOR(0) AS category_integer FROM test01) AS test02


有选择前和选择后操作。例如,
order by
group by
是选择后的指令,例如,
distinct
在选择过程中过滤掉重复的结果,因此重复的结果甚至不进入要排序或分组的结果集

当您将
用作
时,您告诉PostgreSQL获取结果并将其放入输出中名为
category\u integer
的列中。您实际上并没有在这里创建一个在查询执行期间可用的变量,因为结果只有在查询执行之后才可用。因此,您只能使用Subselect来执行此操作,其中,
category\u integer
是表中的一列,而不是一个变量

SELECT category_integer,
  CASE WHEN category_integer = 0
    THEN 'foo'
    ELSE 'bar'
  END AS category_label
FROM (SELECT FLOOR(0) AS category_integer FROM test01) AS test02


postgreSQL,请参见标签(刚刚添加)x86_64-pc-linux-gnu上的postgreSQL 9.6.6,由gcc(gcc)4.8.3 20140911(Red Hat 4.8.3-9)编译,精确到64位其他RDBSM的答案会有所不同吗?对于SQL Server,我经常使用
交叉应用
对于此postgreSQL,请参见标签(刚刚添加)x86_64-pc-linux-gnu上的postgreSQL 9.6.6,由gcc(gcc)4.8.3 20140911(Red Hat 4.8.3-9)编译,精确到64位对于其他RDBSM,答案会有所不同吗?对于SQL Server,我经常使用交叉应用