Se o seu mecanismo permitir ORDER BY x IS NULL, x
ou ORDER BY x NULLS LAST
usar isso. Mas se isso não acontecer, isso pode ajudar:
Se você estiver classificando por um tipo numérico, faça o seguinte: (Emprestando o esquema de outra resposta .)
SELECT *
FROM Employees
ORDER BY ISNULL(DepartmentId*0,1), DepartmentId;

Qualquer número não nulo torna-se 0 e nulos tornam-se 1, que classifica os nulos por último.
Você também pode fazer isso para seqüências de caracteres:
SELECT *
FROM Employees
ORDER BY ISNULL(LEFT(LastName,0),'a'), LastName

Porque 'a'
> ''
.
Isso funciona mesmo com datas coagindo para um int nulo e usando o método para ints acima:
SELECT *
FROM Employees
ORDER BY ISNULL(CONVERT(INT, HireDate)*0, 1), HireDate
(Vamos fingir que o esquema tem HireDate.)
Esses métodos evitam a questão de ter que criar ou gerenciar um valor "máximo" de cada tipo ou corrigir consultas se o tipo de dados (e o máximo) mudar (ambos os problemas que outras soluções ISNULL sofrem). Além disso, eles são muito mais curtos que um CASE.