Как разобраться с условиями? - PullRequest
1 голос
/ 07 июня 2019

Я бы хотел отсортировать таблицу по "номеру", только если тип A

| number | type |
|--------|------|
| 1      |   A  |
| 2      |   B  |
| 3      |   B  |
| 4      |   A  |
| 5      |   A  |

запрос даст:

| number | type |
|--------|------|
| 1      |  A   |
| 4      |  A   |
| 5      |  A   |
| 2      |  B   |
| 3      |  B   |

Сортируются строки с типом "A", затем перечисляются строки "B" (независимо от порядка)

Возможно ли это сделать без UNION?

Ответы [ 3 ]

3 голосов
/ 07 июня 2019
DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(number SERIAL PRIMARY KEY
,type CHAR(1) NOT NULL
);

INSERT INTO my_table VALUES
(1,'A'),
(2,'B'),
(3,'B'),
(4,'A'),
(5,'A');

SELECT * FROM my_table ORDER BY type,CASE WHEN type = 'A' THEN number ELSE RAND() END;
+--------+------+
| number | type |
+--------+------+
|      1 | A    |
|      4 | A    |
|      5 | A    |
|      3 | B    |
|      2 | B    |
+--------+------+
3 голосов
/ 07 июня 2019

ORDER BY type, number будет работать:

SELECT number, type
FROM Tablename
ORDER BY type, number

Демонстрация по SQL Fiddle

Примечание: ORDER BY type, здесь по умолчанию этоупорядочит значения type по возрастанию.Это равно ORDER BY type ASC.В соответствии с вашими потребностями вы можете использовать DESC или ASC.

1 голос
/ 07 июня 2019

A CASE заявление может помочь.

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

select * from TableName 
order by type, CASE WHEN type='A' THEN number ELSE 0 END

Если исходный заказ не требуется сохранять, тогда ELSE RAND() в ответ на вопрос Strawberry - это хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...