PgAdmin列名查询语法新手问题:大小写与表引用困惑
PostgreSQL大小写敏感查询问题解决
问题描述
在PgAdmin中执行SQL查询时遇到错误:
执行的查询语句:
SELECT * FROM public."Sync" WHERE organizationId = "xxx";
返回错误提示:
ERROR: column "organizationid" does not exist
LINE 1: SELECT * FROM public."Sync" WHERE organizationId = "cljybe6z...
^
HINT: Perhaps you meant to reference the column "Sync.organizationId".
尝试给列名加引号或写成"Sync.organizationId"仍报错,存在两个疑问:
- 如何正确引用该列?
- 为何必须指定schema和表名
public."Sync",而不能像psql中直接写sync?
问题解答
1. 正确引用列名的方法
PostgreSQL对标识符(表名、列名等)的大小写规则是:
- 未加双引号的标识符会被自动转为小写处理
- 加双引号的标识符会严格区分大小写
你的问题出在两个细节:
- 列名
organizationId是大小写混合的,未加双引号时会被转成organizationid,但实际表中列名是organizationId(带大写I),因此匹配失败 - 字符串常量
"xxx"用了双引号,PostgreSQL会把它当成标识符(列名)处理,而非字符串值,字符串值必须用单引号包裹
正确的查询语句应为:
SELECT * FROM public."Sync" WHERE "organizationId" = 'xxx';
如果要带上表名限定,需给表名和列名分别加双引号:
SELECT * FROM public."Sync" WHERE "Sync"."organizationId" = 'xxx';
注意:不能把Sync.organizationId整个放在双引号里,否则会被当成一个完整的列名标识符,而非表+列的组合。
2. 为何必须指定schema和带引号的表名
表名大小写的原因
PostgreSQL的标识符规则同样适用于表名:
- 创建表时如果用了双引号(比如
CREATE TABLE "Sync"...),表名会保留大小写,查询时必须用双引号包裹才能识别 - 创建表时未加双引号(比如
CREATE TABLE sync...),查询时写sync或Sync都可以,因为会被自动转成小写匹配
schema指定的原因
- psql中可能默认的搜索路径(
search_path)包含public,所以直接写表名就能找到对应表 - PgAdmin中如果当前会话的搜索路径未包含
public,或者默认schema不是public,就必须指定public.来限定schema;另外,当表名是大小写混合且带双引号时,即使schema在搜索路径里,也需要确保表名引用准确,否则可能因大小写问题找不到表,因此通常会带上schema明确指定
你可以执行以下语句查看当前搜索路径:
SHOW search_path;
如果要临时将public加入默认搜索路径,执行:
SET search_path TO public;
该设置仅对当前会话有效。
内容的提问来源于stack exchange,提问作者Xen_mar
相关产品推荐
相关产品推荐

