видимо в раздел q&a профи не заглядывают =)
предварительно решил сделать пока вот так, но уже понятно, что натуральной сортировки не видать, т.к. для этого надо полюбому сравнивать все строки с друг другом
функция на postgresql для преобразования строки в число, может кому пригодится:
CREATE OR REPLACE FUNCTION string_ordinal(str character varying)
RETURNS double precision AS
$BODY$
DECLARE
_norm VARCHAR;
_ln SMALLINT;
_max_ln SMALLINT;
i SMALLINT;
o DOUBLE PRECISION;
sym CHAR;
code SMALLINT;
norm_code SMALLINT;
BEGIN
_max_ln := 100;
_norm := regexp_replace(lower(str), '[^A-Za-z0-9а-яА-ЯЁё]', '', 'g');
_ln = length(_norm);
IF _ln < _max_ln THEN
_norm = rpad(_norm, _max_ln, '.');
_ln = length(_norm);
END IF;
o := 0.0;
FOR i IN 1.._ln LOOP
sym := SUBSTRING(_norm FROM i FOR 1)::CHAR;
code := ascii(sym);
norm_code := 0;
IF code = 46 THEN
norm_code := 1;
END IF;
IF code >= 48 AND code <= 57 THEN -- 0-9
norm_code := code - 46;
END IF;
IF code >= 97 AND code <= 122 THEN -- a-z
norm_code := code - (96 - 10);
END IF;
IF code >= 1072 AND code <= 1105 THEN -- а-я + ё
IF code = 1105 THEN -- ё имеет код больший, чем я, это плохо
code := 1078;
ELSIF code > 1077 THEN
code := code + 1;
END IF;
norm_code := code - (1071 - 36);
END IF;
o := o + norm_code * power(68, (_ln - i));
END LOOP;
RETURN o;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;