ghr*_*ghr 5 postgresql collation internationalization
我有下表:
CREATE TABLE public_bodies
("id" int, "name" varchar(46))
;
INSERT INTO public_bodies
("id", "name")
VALUES
(1, 'Ytre Helgeland District Psychiatric Centre'),
(2, 'Åfjord Municipality'),
(3, 'Østfold Hospital')
;
Run Code Online (Sandbox Code Playgroud)
我想运行这个查询:
SELECT public_bodies.id, public_bodies.name AS display_name
FROM public_bodies
ORDER BY display_name COLLATE "en_US";
Run Code Online (Sandbox Code Playgroud)
但我得到这个错误:
ERROR: column "display_name" does not exist
LINE 3: ORDER BY display_name COLLATE "en_US";
^
Run Code Online (Sandbox Code Playgroud)
按表名排序可以正常工作:
SELECT public_bodies.id, public_bodies.name AS display_name
FROM public_bodies
ORDER BY public_bodies.name COLLATE "en_US";
-- id | display_name
-- ----+--------------------------------------------
-- 2 | Åfjord Municipality
-- 3 | Østfold Hospital
-- 1 | Ytre Helgeland District Psychiatric Centre
Run Code Online (Sandbox Code Playgroud)
在别名上订购也可以:
SELECT public_bodies.id, public_bodies.name AS display_name
FROM public_bodies
ORDER BY display_name;
-- id | display_name
-- ----+--------------------------------------------
-- 2 | Åfjord Municipality
-- 3 | Østfold Hospital
-- 1 | Ytre Helgeland District Psychiatric Centre
Run Code Online (Sandbox Code Playgroud)
应用COLLATE之前分配别名的工作,但我不明白为什么这与后面的整理不同ORDER_BY.
SELECT public_bodies.id, public_bodies.name COLLATE "en_US" AS display_name
FROM public_bodies
ORDER BY display_name;
-- id | display_name
-- ----+--------------------------------------------
-- 2 | Åfjord Municipality
-- 3 | Østfold Hospital
-- 1 | Ytre Helgeland District Psychiatric Centre
Run Code Online (Sandbox Code Playgroud)
Postgres版本:
SELECT version();
version
-------------------------------------------------------------------------------------------------------------
PostgreSQL 9.1.12 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit
Run Code Online (Sandbox Code Playgroud)
我在SQL小提琴上得到了相同的结果(Postgres 9.3).
为什么Postgres不能在别名字段上整理?
这就是语言的定义方式。COLLATE子句适用于表达式,并且这种情况不符合条件。
我所说的“表达式”是指一些运算符、函数、变量标识符、文字等的集合,它们组合起来产生一个输出值。换句话说,产生价值的“事物”的一般类别,允许作为函数参数、SELECT字段定义、列表VALUES等出现。
子句COLLATE可以附加到表达式上,并且表达式可以出现在列表中ORDER BY,但它不是列表中唯一允许的内容ORDER BY;您还可以包含输出列的名称或位置,但解析器将它们视为不同的情况。
需要区别对待它们的原因是,在计算表达式时,查询的输出字段标识符不在范围内;这就是为什么类似的东西ORDER BY display_name || 'x'会随着column "display_name" does not exist. 为了解决这个问题,ORDER BY在尝试表达式求值之前,列表中的裸字段名称会与输出列表进行比较,但因此,在此上下文中不会接受比裸字段名称更复杂的内容(并且包括附加子句COLLATE) 。
| 归档时间: |
|
| 查看次数: |
155 次 |
| 最近记录: |