Как сортировать второй столбец на основе значений первого столбца?

Пытаюсь извлечь данные из таблицы, но мне нужно, чтобы они были отсортированы специфическим образом, и не уверен, возможно ли это в 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 шт):

Автор решения: 0xdb

Достаточно сортировать по признаку - 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

→ Ссылка