SQL使用中间结果

时间:2018-07-12 08:42:59

标签: sql postgresql

我有一列带有数字(浮点数)的列,我想将其分类并存储为整数和标签(字符串)。现在,假定类别仅由FLOOR(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表达式中重用中间变量?

SQL Fiddle

我一定错过了,但是到目前为止我找不到相关的问题。

2 个答案:

答案 0 :(得分:1)

您可以求助于常见的表表达式-基本上是一个查询,该查询会生成带有标记的结果集,您可以在后续查询中引用该结果集。

适合您的示例:

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
    ;

请咨询参考以获取更多详细信息:CTE / WITH in pgSQL 9.6

SQL fiddle中查看它的工作情况。

答案 1 :(得分:1)

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

使用AS时,是在告诉PostgreSQL获取结果并将其放在输出中名为category_integer的列中。您实际上并未在此处创建在查询执行期间可用的变量,因为结果仅在查询执行后可用。因此,您只能使用子选择来执行此操作,在子选择中,结果本身可以用作虚拟表,其中category_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

https://www.postgresql.org/docs/current/static/queries-select-lists.html

https://www.postgresql.org/docs/current/static/queries-table-expressions.html#QUERIES-TABLE-ALIASES