SQL использует промежуточные результаты

У меня есть столбец ВЫБЕРИТЕ зарплату , ПОЛ ( зарплаты ) AS category_integer , СЛУЧАЙ , КОГДА ПОЛ ( зарплата ) = 0 THEN «Foo» ELSE «бар» END AS category_label FROM test01 чисел ( с плавающей точкой) , что я хотел бы классифицировать и хранить категории ВЫБРАТЬ зарплата , ЭТАЖ ( зарплата ) AS category_integer , CASE WHEN category_integer = 0 THEN 'foo' ELSE 'bar' END AS category_label FROM test01 integer и как метка (строка). Предположим, что категория просто определяется FLOOR (x).

Это работает:

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', определенную в начале моего запроса в более поздней части, примерно так:

order by

но это, по-видимому, не так, как работает SQL. Я просмотрел раздел «Общие таблицы», но там пропал. Есть ли способ повторно использовать промежуточные переменные в выражении SQL?

SQL Fiddle

Я, должно быть, пропустил это, но до сих пор я не мог найти связанных вопросов.

sql,postgresql,

0

Ответов: 2


1 принят

Вы можете прибегнуть к общим табличным выражениям - в основном запрос, который создает помеченный результирующий набор, на который вы можете ссылаться в последующих запросах.

Адаптировано к вашему примеру:

group by

Для получения дополнительной информации см. Ссылку: CTE / WITHin pgSQL 9.6 .

Посмотрите на работу в скрипте SQL .


1

Есть операции до и после выбора. Например, distinctа ASтакже инструкции после выбора, category_integerнапример, отфильтровывают повторяющиеся результаты во время самих процессов выбора, и поскольку такие повторяющиеся результаты даже не вводят набор результатов, который нужно упорядочить или сгруппировать.

Когда вы используете 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

SQL, PostgreSQL,
Похожие вопросы