Причина в том, что строка сортируется в алфавитном порядке (вместо того, чтобы численно, как вы хотели бы) и 1 сортирует до 9.
Вы можете решить это так:
SELECT * FROM employees ORDER BY substring(em_code, 3)::int DESC
Было бы эффективнее удалить избыточный 'EM' из вашего em_code
- если вы можете - и сохранить целое число для начала.
Дополнительный ответ на вопрос в комментарии
Чтобы удалить все и не все цифры из строки:
SELECT regexp_replace(em_code, E'\\D','','g')
FROM employees
\D
- это регулярное выражение Сокращение класса для "не цифр".
'g'
в качестве 4-го параметра - это глобальный переключатель, который применяет замену к каждому вхождению в строке, а не только к первому.
Таким образом, я заменяю каждую нецифровую пустую строку, выделяя только цифры из строки.