我有一个varchar字段,其中一个键由一个字符串组成,该字符串有时会有一些模式,以一个名称&时间戳。
我想支持删除具有给定前缀的旧记录,并且我希望运行DELETE FROM table WHERE key < %s
之类的查询,但我想知道我到底要做什么。我找不到任何关于这应该如何工作的官方文档。它们存在吗?我找到了 Practical Postgres 书,提到它基于字母顺序,但我不确定在任何官方文档中是否仍然如此。除了我的探索之外,还有什么最新的我可以参考吗?
答案 0 :(得分:2)
字符串根据libc strcmp
function执行的词汇比较进行排序,使用指定的排序规则,按优先级的降序排列:
COLLATE
或ORDER 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.
所以如果你想要一个自然的或人性化的排序,你需要变得更加复杂 - 将字段分开并对每个部分进行排序。参见: