Postgres Varchar Comparion Docs?

时间:2015-10-02 00:06:50

标签: postgresql

我有一个varchar字段,其中一个键由一个字符串组成,该字符串有时会有一些模式,以一个名称&时间戳。

我想支持删除具有给定前缀的旧记录,并且我希望运行DELETE FROM table WHERE key < %s之类的查询,但我想知道我到底要做什么。我找不到任何关于这应该如何工作的官方文档。它们存在吗?我找到了 Practical Postgres 书,提到它基于字母顺序,但我不确定在任何官方文档中是否仍然如此。除了我的探索之外,还有什么最新的我可以参考吗?

1 个答案:

答案 0 :(得分:2)

字符串根据libc strcmp function执行的词汇比较进行排序,使用指定的排序规则,按优先级的降序排列:

  • 对运营商明确COLLATEORDER BY
  • 上指定的任何COLLATE
  • 数据库的默认LC_COLLATE

(以上是从记忆中,检查手册是100%肯定的。)

因此,排序因您的语言环境而异。例如,在某些语言环境中,会忽略标点符号和/或空格,并且按个别情况排序也会有所不同。

您可以使用COLLATE "C"覆盖数据库的默认排序顺序,并按字符串的简单字节顺序排序。

所有字符串排序 - 使用区域设置排序规则 - 都是“哑”,因为它们无法识别数字,日期等。排序顺序不是人们通常会选择的排序顺序。例如:

SELECT i
FROM generate_series(0,22) i
ORDER BY i::text COLLATE "C";

将发出

1
11
2
...

类似地:

SELECT d
FROM (
  VALUES
  ('2001'),
  ('2000 A.D.'),
  ('600 B.C.')
) x(d)
ORDER BY d;

产生

 2000 A.D.
 2001
 600 B.C.

所以如果你想要一个自然的或人性化的排序,你需要变得更加复杂 - 将字段分开并对每个部分进行排序。参见: