我有下表:
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') ;
我想运行这个查询:
SELECT public_bodies.id,public_bodies.name AS display_name FROM public_bodies ORDER BY display_name COLLATE "en_US";
但我得到这个错误:
ERROR: column "display_name" does not exist LINE 3: ORDER BY display_name COLLATE "en_US"; ^
按表名排序可以正常工作:
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
在别名上订购也可以:
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
在分配别名之前应用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
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
我在sql小提琴上得到了相同的结果(Postgres 9.3).
为什么Postgres不能在别名字段上整理?
解决方法
这是语言定义的方式. COLLATE子句适用于表达式,这种情况不符合条件.
“表达式”是指一些运算符,函数,变量标识符,文字等的集合,它们组合起来产生一个输出值.换句话说,允许在VALUES列表中作为函数参数,SELECT字段定义出现的值生成“事物”的一般类,等等.
COLLATE子句可以附加到表达式,表达式可以出现在ORDER BY列表中,但它不是ORDER BY列表中唯一允许的内容;您还可以包含names or positions of output columns,但解析器将这些视为一个独特的案例.
需要区别对待的原因是查询表达式时查询的输出字段标识符不在scope中;这就是ORDER BY display_name ||之类的原因’x’返回,列“display_name”不存在.要解决此问题,ORDER BY列表中的裸字段名称将在输出列表与输出列表进行比较之前,甚至尝试进行表达式求值,但因此,在此上下文中不会接受比裸字段名称更复杂的内容(并且包含附加内容) COLLATE子句).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。