如何通过COLLATION整理空格和撇号?

时间:2018-07-09 10:05:44

标签: sql postgresql

我正在使用任意函数来确保“ 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

0 个答案:

没有答案
相关问题