Я бы пошел путем регулярного выражения:
демо: дб <> скрипка
WITH cte AS (
SELECT
item_no,
regexp_replace(item_no, '\D', '', 'g')::int AS digit,
regexp_replace(item_no, '\d', '', 'g') AS nondigit,
regexp_replace('200a', '\D', '', 'g')::int AS compare_digit,
regexp_replace('200a', '\d', '', 'g') AS compare_nondigit
FROM t
)
SELECT
item_no
FROM
cte
WHERE
(digit > compare_digit) OR (digit = compare_digit AND nondigit > compare_nondigit)
Разделение обоих значений (значения строки и сравниваемого) на обе части (цифры и не цифры) и сравнение каждой части по отдельности.
Мне любопытно, есть ли лучшее решение.