Выберите конкретные столбцы по псевдониму, а затем упорядочите - PullRequest
0 голосов
/ 16 апреля 2019

Моя таблица:

+----+----------+--------+
| id | priority |  User  |
+----+----------+--------+
|  1 |        2 | [null] |
|  2 |        1 | [null] |
|  3 |        3 | Tony   |
|  4 |        2 | John   |
|  5 |        2 | Andy   |
|  6 |        1 | Mike   |
+----+----------+--------+

Моя цель - извлечь их и упорядочить по следующим комбинированным условиям:

  1. priority = 1
  2. Пользователь имеет значение null
+----+----------+--------+-----------+
| id | priority |  User  | peak_rows |
+----+----------+--------+-----------+
|  1 |        2 | [null] | 1         |
|  2 |        1 | [null] | 1         |
|  6 |        1 | Mike   | 0         |
|  3 |        3 | Tony   | 1         |
|  4 |        2 | John   | 0         |
|  5 |        2 | Andy   | 0         |
+----+----------+--------+-----------+

Это то, что я могу сделать

select
    id,
    CASE WHEN priority = 1 THEN 1 ELSE 0 END as c1,
    CASE WHEN User is NULL THEN 1 ELSE 0 END as c2,
    c1 + c2 AS peak_rows
FROM mytable
ORDER BY peak_rows DESC

, но это приводит к ошибке:

ERROR:  column "c1" does not exist
LINE 5:  c1+ c2as pp
         ^
SQL state: 42703
Character: 129

Я не знаюНе знаю, почему я делаю 2 столбца (с1 и с2), но я не могу использовать его позже.

Есть ли хорошая идея сделать это?

Ответы [ 3 ]

1 голос
/ 16 апреля 2019

Полагаю, ваша цель - заказать по этим c1 и c2, чтобы вы могли напрямую использовать их в предложении order by. Вам просто нужно поменять 0 и 1 в операторах case..when. И в зависимости от ваших priority=1 критериев id=2 должен оставаться на вершине.

with mytable( id, priority, "User" ) as
(
 select 1 , 2,  null  union all
 select 2,  1,  null  union all
 select 3,  3, 'Tony' union all
 select 4,  2, 'John' union all
 select 5,  2, 'Andy' union all
 select 6,  1, 'Mike'
)    
select * 
  from mytable
 order by ( case when priority = 1   then 0 else 1 end ) +
          ( case when "User" is null then 0 else 1 end );

id  priority   User
--  -------- -------
2   1         [null]
1   2         [null]
6   1          Mike
3   3          Tony
4   2          John
5   2          Andy

Демо

1 голос
/ 16 апреля 2019
select
    id,
    CASE WHEN priority = 1 THEN 1 ELSE 0 END as c1,
    CASE WHEN User is NULL THEN 1 ELSE 0 END as c2,
    (CASE WHEN priority = 1 THEN 1 ELSE 0) + ( CASE WHEN User is NULL THEN 1 ELSE 0 END) AS peak_rows
FROM mytable
ORDER BY peak_rows DESC
1 голос
/ 16 апреля 2019

Вы не делаете два столбца и используете их позже, вы делаете их и хотите использовать их одновременно. Вы можете использовать подзапрос.

SELECT a.id, a.priority, a.User, a.c1 + a.c2 AS peak_rows
FROM
(SELECT id,
        priority,
        User,
        CASE WHEN priority = 1 THEN 1 ELSE 0 END as c1,
        CASE WHEN User IS NULL THEN 1 ELSE 0 END as c2,
 FROM mytable) a
ORDER BY peak_rows DESC;

...