加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql – 对别名字段的Postgres整理

发布时间:2020-12-13 16:07:21 所属栏目:百科 来源:网络整理
导读:我有下表: 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
我有下表:

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子句).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读