我正在使用任意函数来确保“ foo”和“ foo bar”位于“ foobar”之前,例如。
CREATE FUNCTION std_collate(text) RETURNS text AS $f$
SELECT regexp_replace($1, E'[ \'\-]', '0', 'g')
$f$ language SQL;
但是优雅的方法是使用ORDER BY x collate y
(而不是ORDER BY f(x)
)...因此,如何执行此操作,也许使用CREATE COLLATION
,等等。
CREATE TABLE t (name text);--delete from t;
INSERT INTO t VALUES ('Foo'),('Bar'),('Brasilândia'),('Foo-Bár'),
('Brasil Novo'),(E'Foo-B\'ár'),('Foo-B-ár'),('Foo Bar'),('Foo-Bar'),('FooBar');
SELECT name FROM t ORDER BY std_collate(name), name; -- good
SELECT name FROM t ORDER BY 1; -- bad
将生成
-- good
Bar
Brasil Novo
Brasilândia
Foo
Foo-B’ár
Foo-B-ár
Foo Bar
Foo-Bar
Foo-Bár
FooBar
-- bad
Bar
Brasilândia
Brasil Novo
Foo
FooBar
Foo Bar
Foo-Bar
Foo-Bár
Foo-B-ár
Foo-B’ár