Как сортировать второй столбец на основе значений первого столбца?
Пытаюсь извлечь данные из таблицы, но мне нужно, чтобы они были отсортированы специфическим образом, и не уверен, возможно ли это в SQL.
Что мне нужно, извлечь все строки, но упорядочить их так, чтобы там, где столбец 3 null, то они были бы упорядочены первыми. Затем, все строки, которые не являются нулевыми в столбце 3, будут показаны ПОСЛЕ строки, которая имеет их значение в столбце 1.
Что есть:
+------+-------+------+
| Col1 | Col2 | Col3 |
+------+-------+------+
| 1 | text | |
| 2 | text | 1 |
| 3 | text | 1 |
| 8 | text | 10 |
| 9 | text | 10 |
| 10 | text | |
+------+-------+------+
Что хотелось бы получить:
+------+-------+------+
| Col1 | Col2 | Col3 |
+------+-------+------+
| 1 | text | |
| 2 | text | 1 |
| 3 | text | 1 |
| 10 | text | |
| 8 | text | 10 |
| 9 | text | 10 |
+------+-------+------+
Что уже пробовал.
Первое, что попробовал:
ORDER BY coalesce(Col3, Col1)
Результат почти близкий к ожидаемому, но значение Col1=10 должно быть перед значением Col3=10:
+------+-------+------+
| Col1 | Col2 | Col3 |
+------+-------+------+
| 1 | text | |
| 2 | text | 1 |
| 3 | text | 1 |
| 8 | text | 10 |
| 9 | text | 10 |
| 10 | text | |
+------+-------+------+
Я также пытался создать новую колонку, где если Col3 равен null, то Col4 - true, а false- в противном случае. Но по сути, это то же самое, что и с coalesce выше.
Свободный перевод вопроса Ordering second column based on the first column от участника @stackiee
Ответы (1 шт):
Достаточно сортировать по признаку - nulls в первую очередь:
select *
from t
order by coalesce (col3, col1), col3 nulls first, col1
/
COL1 COL2 COL3
---------- ---- ----------
1 text
2 text 1
3 text 1
10 text
8 text 10
9 text 10
Свободный перевод ответа от участника @Gordon Linoff