PostgreSQL如何排序文本值?

时间:2019-06-28 22:03:25

标签: sql postgresql sql-order-by

以下查询

SELECT * FROM (VALUES('c'), ('a'), ('b'), ('"a"')) X ORDER BY 1 ASC

产生

a
"a"
b
c

那么"a"会出现在a之后,即使它以非字母字符(例如")开头吗?

我认为输出应该是

"a"
a
b
c

似乎PostgreSQL在对这些值进行排序时正在剥离非字母字符,但这对我来说没有意义。

2 个答案:

答案 0 :(得分:3)

文本(char,varchar,text)的排序行为取决于区域设置的当前排序规则。尝试使用,

SELECT * 
FROM (VALUES('c'), ('a'), ('b'), ('"a"')) X(col) 
ORDER BY col COLLATE "C" asc;

“ C”排序规则是按字节排序的排序规则,它忽略了本国语言规则,编码等。

答案 1 :(得分:0)

在VALUES行值构造函数中,对文字的排序规则进行了一些“有趣”操作,但是如果您使用“真实”表,则查询将按预期进行排序:

CREATE TABLE T (StringCol VARCHAR(5));
INSERT T Values ('a'),('b'),('c'),('"a"');
SELECT * FROM T ORDER BY 1

我快速浏览了this topic,但是找不到明显的原因,需要更深入的阅读,但是您应该在那找到答案。

HTH