Można użyć SIGN aby posortować liczby dodatnie do góry, a następnie weź wartość bezwzględną za pomocą ABS aby uzyskać żądany ASC/DESC.
SELECT * FROM theTable
ORDER BY SIGN(col) DESC, ABS(col)
EDYTUJ
Jak zauważył Nahuel, powyższe posortuje zera do środka między dodatnimi a ujemnymi. Aby zamiast tego pogrupować je z pozytywami, możesz użyć CASE
zamiast tego (lub, jeśli twoja kolumna jest tylko liczbami całkowitymi, nieco magiczny SIGN(col + 1)
)
SELECT * FROM theTable
ORDER BY
CASE WHEN col >= 0 THEN 1 ELSE 2 END,
ABS(col)