【问题标题】:Postgres Varchar Comparion Docs?Postgres Varchar 比较文档?
【发布时间】:2015-10-02 00:06:49
【问题描述】:

我有一个 varchar 字段,它的键由一个字符串组成,该字符串有时具有某种模式,它以名称和时间戳开头。

我想支持删除具有给定前缀的旧记录,并且我想运行像DELETE FROM table WHERE key < %s 这样的查询,但我想确切地知道我正在处理什么。我找不到任何关于这应该如何工作的官方文档。它们存在吗?我发现 Practical Postgres 书中提到它是按字母顺序排列的,但我不确定在任何官方文档中是否仍然如此。除了闲逛之外,还有什么我可以参考的最新信息吗?

【问题讨论】:

  • 本网站不用于询问对外部资源的引用。相反,请改写您的问题,举例说明您拥有的数据、想要删除的数据以及想要保留的数据。
  • 我认为这是一个很好的问题,手册确实缺乏这方面的信息。但我同意这是题外话。你应该在 Postgres 邮件列表上发布这个:postgresql.org/list 简而言之:比较取决于使用的排序规则:postgresql.org/docs/9.4/static/collation.html

标签: postgresql


【解决方案1】:

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

  • 运算符上的显式COLLATE 或ORDER BY
  • 列上指定的任何COLLATE
  • 数据库默认LC_COLLATE

(以上是凭记忆,查手册百分百确定)。

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

您可以使用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.

因此,如果您想要自然或人性化的排序,则需要变得更复杂 - 拆分字段并对每个部分进行排序。见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多