A правильная и более быстрая версия может выглядеть так:
SELECT *
FROM tbl
ORDER BY substring(name, '([^[:space:]]+)(?:,|$)')
Или:
ORDER BY substring(name, E'([^\\s]+)(?:,|$)')
Или даже:
ORDER BY substring(name, E'([^\\s]+)(,|$)')
Объяснять
[^[:space:]]+
.. первая (и самая длинная) строка, состоящая из одного или нескольких непробельных символов.
(,|$)
.. оканчивается запятой или концом строки.
Последние два примера используют синтаксис escape-строки и сокращение класса \s
вместо длинной формы [[:space:]]
(которая теряет внешний уровень скобок внутри класса символов).
На самом деле нам не нужно использовать не захватывающие скобки (?:)
после части, которую мы хотим извлечь, потому что ( цитирование руководства ):
.. если шаблон содержит круглые скобки, часть текста, которая
соответствует первому заключенному в скобки подвыражению (тот, чей левый
сначала ставится скобка) возвращается
Test
SELECT substring(name, '([^[:space:]]+)(?:,|$)')
FROM (VALUES
('John Smith')
,('John J. Smith')
,('John J. Smith, Sr.')
,('foo bar Smith, Jr.')
) x(name)