Postgres动态构建查询:标识符引号规则及关键词获取咨询
问题
我想要动态构建PostgreSQL查询,其中包含标识符名称。为使输出尽可能可读,我计划仅在必要时为标识符添加引号,并假设用户传入的是准确的标识符名称。
示例输入与理想输出如下:
- 表名输入:
hello,输出:select * from hello - 表名输入:
Hello,输出:select * from "Hello"(含大写) - 表名输入:
select,输出:select * from "select"(为关键字)
因此,我希望获取一份即使传入全小写也需加引号的关键字列表,请问PostgreSQL是否有可查询的元表能提供该列表,还是需要基于官方文档硬编码?我认为可查询元表更优,以防后续新增关键字(即便这种情况不太可能带来破坏性变化)。
回答
PostgreSQL确实提供了可直接查询的系统表来获取关键字列表,完全不需要硬编码。你可以通过pg_catalog.pg_keywords系统视图或pg_get_keywords()函数获取完整的关键字信息。
查询方法
- 查询
pg_keywords视图筛选保留关键字:
SELECT word FROM pg_catalog.pg_keywords WHERE catcode = 'R';
这里catcode = 'R'对应的是保留关键字——也就是那些即使全小写也必须加引号才能作为标识符使用的关键字(比如select、from、where等)。其他类别(如catcode = 'U'的非保留关键字)在特定语境外可不用加引号,若只关注必须强制加引号的关键字,仅需筛选R类即可。
- 使用
pg_get_keywords()函数查询:
SELECT * FROM pg_get_keywords();
该函数返回的结果与pg_keywords视图一致,包含关键字名称、类别代码及类别描述。
补充说明
除了保留关键字,以下两种情况也必须给标识符加引号:
- 标识符包含大写字母(PostgreSQL默认会将未加引号的标识符转为小写)
- 标识符包含特殊字符(比如空格、连字符、@等)
用系统表查询的优势完全契合你的需求:自动适配当前PostgreSQL版本的关键字列表,无需手动维护,能应对版本升级带来的关键字变化。
内容的提问来源于stack exchange,提问作者user1002973
相关产品推荐
相关产品推荐

