2015-10-02 58 views
1

我有有由,有时有一定的模式给它,它与一个名字&时间戳开头的字符串的密钥的VARCHAR字段。Postgres Varchar比较文档?

我想支持删除具有给定前缀的旧记录,并且我想运行一个查询,如DELETE FROM table WHERE key < %s,但我想知道我到底在干什么。我无法找到任何关于这应该如何工作的官方文档。它们存在吗?我发现实用的Postgres本书,提到它是基于按字母顺序排列,但我不知道这是仍处于任何官方文件属实。有没有什么最新的,我可以参考,而不是我的戳?

+2

这个网站是不是要求对外部资源的引用。相反,请重新提出您的问题,以举例说明您拥有的数据,希望您想要删除的内容以及要保留的内容。 – Patrick

+1

我认为这是一个很好的问题,手册确实缺乏这方面的信息。但我同意这是无关紧要的。你应该张贴此Postgres的邮件列表:http://www.postgresql.org/list/一言以蔽之:比较是取决于归类中使用:http://www.postgresql.org/docs/9.4/static /collat​​ion.html –

回答

2

的字符串进行排序基于如由libc strcmp function进行,使用由指定的整理,以优先递减顺序词法比较:

  • 在操作者的显式COLLATEORDER BY
  • 不限COLLATE指定在列
  • 数据库的默认LC_COLLATE

(以上内容来自内存,请检查手册100%确定)。

这样的排序变化的基础上您的语言环境。例如,在某些语言环境中,标点符号和/或空白符被忽略,并且按大小写排序也各不相同。

您可以使用COLLATE "C"来覆盖DB和排序字符串的简单的字节顺序默认的排序顺序。

所有字符串排 - 与语言环境排序规则或不 - 是“愚蠢的”,因为他们不认识数字,日期等的排列顺序是不是有什么人会通常选择。例如:

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. 

,所以如果你想有一个自然的,或人源化,排序,你”你需要变得更加复杂 - 分裂字段和排序每个部分。请参阅: