quote_ident() 不会向列名“first”添加引号

2023-12-07

我需要获得正确用双引号引起来的列名。quote_ident()好像没有做到吧?

select 1 first; -- fails
select quote_ident('first'); -- produces first, not "first"

我可以使用什么命令来成功引用标识符。我正在尝试动态构建一个SELECT声明:

SELECT 'select ' 
|| string_agg(
        case when udt_name in ('varchar', 'text')
            then 'left(' || quote_ident(column_name) || ', 65535) ' || quote_ident(column_name)
        else quote_ident(column_name)
        end, ',' order by ordinal_position) 
|| ' from "public"."MyTableName"'
FROM information_schema.columns c
join parse_ident('"public"."MyTableName"') t 
on t[1] = table_schema and t[2] = table_name

这正在生成:

SELECT id, left(first, 65535) first from "public"."MyTableName";

这会爆炸,因为首先作为列名需要用双引号引起来。


不要省略AS列别名的关键字

SELECT id, left(first, 65535) first from "public"."MyTableName";

这会爆炸,因为首先作为列名需要用双引号引起来。

不完全是。它爆炸了,因为你省略了关键字AS不应该被省略的地方。

这有效:

SELECT 'select ' 
|| string_agg(
        case when udt_name in ('varchar', 'text')
            then 'left(' || quote_ident(column_name) || ', 65535) AS '  -- !!
              ||  quote_ident(column_name)
        else quote_ident(column_name)
        end, ', ' order by ordinal_position) 
|| ' from "public"."MyTableName"'
FROM information_schema.columns c
join parse_ident('"public"."MyTableName"') t 
on t[1] = table_schema and t[2] = table_name;

生产:

SELECT id, left(first, 65535) AS first from "public"."MyTableName";

依次按预期工作。

The 手册关于“省略 AS 关键字”:

在SQL标准中,可选关键字AS前面可以省略 每当新列名是有效列时输出列名 名称(即与任何保留关键字不同)。 PostgreSQL 是 限制性稍强一些:AS如果新列名称是必需的 匹配任何关键字,无论是否保留。推荐的做法是 使用 AS 或双引号输出列名,以防止任何可能的 与将来添加的关键字冲突。

省略关键字就可以了AS适用于表别名,但不适用于列别名。

first不是一个保留字在 Postgres 中。 (它曾经在古老的 SQL 标准 SQL-92 中被“保留”,但在标准 SQL 中也不再被保留。)“非保留”* 准确地说。手册:

非保留关键字仅在特定上下文中具有特殊含义,并且可以在其他上下文中用作标识符。

省略AS使它成为这样一个背景。

quote_ident()工作可靠。手册:

返回适当引用的给定字符串以用作标识符 在 SQL 语句字符串中。仅在必要时添加引号(即 如果字符串包含非标识符字符或者将是 折叠盒)。嵌入的引号适当加倍。

format()与说明符%I做同样的事情。

未提及保留字,但无论如何都正确引用。准确的说:所有关键词都标注了“预订的” or “(不能是函数或类型)”在“PostgreSQL”列中the SQL关键字 table.

我将提交一个文档错误来添加它。

绝对确定的是:quote_all_identifiers

如果你想绝对确定并且不介意所有增加的噪音,你可以强制 Postgres 引用all带有配置参数的标识符quote_all_identifiers. 手册:

当数据库生成 SQL 时,强制所有标识符都加引号,即使它们(当前)不是关键字。

这包括来自的输出quote_ident() and format()。我会not这样做,害怕所有增加的噪音。

您可以在本地设置参数SET LOCAL在同一笔交易中。喜欢:

BEGIN;
SET LOCAL quote_all_identifiers = true;
SELECT ...
END;

Faster

也就是说,我会用format() and concat()并定位目录表pg_attribute相反:更干净、更简单、更快。但不能移植到其他 RDBMS:

SELECT format('SELECT %s FROM %s;'
            , string_agg(CASE WHEN atttypid = ANY ('{text, bpchar, varchar}'::regtype[])
                              THEN concat('left(', col, ', 65535) AS ', col)
                              ELSE col END, ', ')
            , attrelid)
FROM  (
   SELECT attrelid::regclass, atttypid, quote_ident(attname) AS col
   FROM   pg_catalog.pg_attribute
   WHERE  attrelid = 'public."MyTableName"'::regclass  -- provide once, optionally schema-qualified
   AND    attnum > 0
   AND    NOT attisdropped
   ORDER  BY attnum
   ) sub
GROUP  BY attrelid;

生产:

SELECT id, left(first, 65535) AS first FROM "MyTableName";

数据库小提琴here

尤其, ...

  • ...您只需提供一次表名,可以选择模式限定。
  • ...如果该表不存在,查询会立即失败并显示一条有用的错误消息。
  • ...输出表名称仅是模式限定的,并在必要时用双引号引起来。
  • ...这也涵盖character(N)(内部名称bpchar).

进一步阅读:

  • 如何检查给定模式中是否存在表
  • postgres psql select 语句中默认截断显示
  • PostgreSQL 强制所有数据大写
  • 检查字符类型列中是否存在空字符串
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

quote_ident() 不会向列名“first”添加引号 的相关文章

  • 显式与隐式 SQL 连接

    显式内连接与隐式内连接之间有效率差异吗 例如 SELECT FROM table a INNER JOIN table b ON a id b id vs SELECT a b FROM table a table b WHERE a id
  • 使用 SqlDataReader.IsDBNull 时使用列名

    我已经得到了从 SQL DB 读取数据的代码 我不知道应该如何编辑它 以便我可以使用原始列名称而不是列索引 string query SELECT FROM zajezd WHERE event thisrow AND year klien
  • 显示包含特定表的所有数据库名称

    我的 SQL Server 中有很多数据库 我必须只搜索包含特定表名的数据库名称Heartbitmaster 我有很多数据库 例如Gotgold DVD等 我只想从包含此表的查询中查找数据库名称Heartbitmaster 我搜索我尝试查询
  • 每个搜索词显示一行,如果未找到则替换默认值

    Query SELECT product id name FROM product WHERE barcode in 681027 8901030349379 679046 679047 679082 679228 679230 67923
  • MYSQL:SQL查询获取自增字段的值

    我有一张桌子 主键是id及其自动递增 现在 当我插入新记录时 我需要获取更新记录的 id 我怎样才能做到这一点 如果我使用查询 select max id from table name 执行后我可以获得id 但我能确定它是刚刚插入的记录的
  • 选定的非聚合值必须是关联组的一部分

    我在 Teradata 中有两个表 Table A 和 Table B 它们之间是 LEFT JOIN 之后我将创建 SELECT 语句 其中包含两个表中的属性 SELECT attribute 1 attribute 2 attribut
  • 如何从 postgresql 函数或触发器发送一些 http 请求

    我需要通过 http 协议 GET 或 POST 请求 从函数或触发器发送数据 是否可以 您可以尝试用 PL Python 编写触发器并使用 urllib2 进行 POST
  • 如何记录数据库代码以查看数据库对象之间的依赖关系? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想为我的宠物项目编写文档 我的 PostgreSQL 数据库中有 30 个表 近 50 个视图和大约 30 个函数 存储过程 我想看
  • 返回年份数组作为年份范围

    我正在尝试查询一个包含以下内容的表character varying 年份列 并将这些年份作为逗号分隔的年份范围字符串返回 年份范围将由数组中存在的连续年份确定 不连续的年份 年份范围应以逗号分隔 数据类型的原因是character var
  • 如何在sql server中对行号进行内连接

    SQL Server 2008 两张表 表A有以下数据 RowA RowB RowC RowD 表B有以下数据 Row4 Row3 Row2 Row1 我想得到以下输出 RowA Row1 RowB Row2 RowC Row3 RowD
  • SELECT DISTINCT HAVING 计算唯一条件

    我已经搜索过这个问题的答案 但找不到如何根据条件获取这个不同的记录集 我有一个包含以下示例数据的表 Type Color Location Supplier Apple Green New York ABC Apple Green New
  • Postgres 平均值计算忽略 null

    这是我的 postgres 表 name revenue John 100 Will 100 Tom 100 Susan 100 Ben 5 rows 在这里 当我计算平均收入时 它返回 100 这显然不是这种情况 而总和 计数 即 400
  • 日志中每天的每周活跃用户数

    我想知道是否有人可以帮助我使用一些 SQL 来返回两天或更长时间内登录到数据库表的唯一用户数量 让我们使用 7 天作为参考 我的日志表在每一行中包含时间戳 ts 和 user id 表示该用户当时的活动 以下查询返回此日志中的每日活跃用户数
  • 有没有办法在插入查询中执行另一个查询?

    好的 这是我的查询 我刚刚添加了 ACCOUNTID 和 accountID 部分 这显然不起作用 INSERT INTO Leads LEADID CREATEUSER CREATEDATE FIRSTNAME MODIFYDATE AC
  • 随机数据库与 AWS 中的 Django 和 Postgresql 断开连接

    我试图找出 Django 和数据库连接错误问题的根源 此时 我正在调试提示 因为我认为症状太不具体 一些背景 我一直在使用这个堆栈 在 AWS 中部署了很多年 没有出现任何问题 Ubuntu 在本例中为 20 04 LTS Nginx Uw
  • 提高 PostgreSQL 1 亿数据左连接查询性能

    我在用Postgresql 9 2 version Windows 7 64 bit RAM 6GB 这是一个Java企业项目 我必须在我的页面中显示订单相关信息 有三个表通过左连接连接在一起 Tables TV HD 389772 行 T
  • 在 where 子句中使用聚合函数和不同的列条件

    select PO Order Qty Avg PO Order Qty as totalAverage FROM FirstStrike Retail custom Whse Pricing QR where item code 111
  • Ubuntu 12.04 上的 DeepDive 安装指南

    在拥有以后很多问题 https stackoverflow com questions 22469188 deepdive installation postgresql error安装深潜项目 http deepdive stanford
  • SQL Server 中的嵌套事务

    sql server 允许嵌套事务吗 如果是的话那么交易的优先级是什么 来自 SQL Server 上的 MSDN 文档 嵌套交易 http msdn microsoft com en us library ms189336 SQL 90
  • 计算包含字母/数字的行数

    我想要实现的目标很简单 但是解释起来有点困难 我不知道在 postgres 中这是否真的可能 我处于相当基础的水平 SELECT FROM WHERE LEFT JOIN ON HAVING 等等基本的东西 我正在尝试计算包含特定字母 数字

随机推荐

  • 在表单中暂停 GIF

    只是想知道如何暂停 GIF 图像 我正在访问服务器 我希望在发生某些事情时播放 gif 图像 并且如果系统冻结 我希望它暂停 我有一个图片框 上面附有图像 这可能吗 PictureBox 使用 ImageAnimator 类来制作 GIF
  • 如何处理NLP中的两种实体提取方法

    我正在使用两种不同的实体提取方法 https rasa com docs nlu entities 同时在 RASA 框架中构建我的 NLP 模型以构建聊天机器人 机器人应该处理具有自定义实体以及一些一般问题 例如位置或组织 的不同问题 因
  • 如何在Xcode 8中按顺序调用XCTest测试用例函数?

    XCTest 测试函数按字母顺序调用 在 Xcode 8 之前 使用 Xcode 8 我无法假设系统调用测试用例的顺序 有人可以阐明它吗 类内的测试在 Xcode 8 中以随机顺序运行 这鼓励测试独立的 and 可重复的 我假设您想按特定顺
  • TEE 2012 不会自动检出文件

    我有 TFS Server 2012 SP1 Eclipse 3 6 2 Helios 服务版本 2 三通 11 0 0 201211191425 我看到了完整的团队菜单 我可以手动签出和签入文件 但是 如果我刚刚开始编辑文件 它不会自动检
  • 生成字符数组的所有排列

    读了这么多 生成字符串排列 的帖子后 我尝试用Java编写它 1 从第一个字符开始与组合中的其余字符交换 但是当我尝试使用递归实现它时 它只给了我两个长度为 3 的字符串 public static void main String arg
  • 使用泛型方法时如何正确约束相关类类型?

    我有两个基类BaseObject and BaseObjectSettings 第一个定义对象行为 第二个定义类的状态 对于序列化有用 如果我想创建具有特定设置的派生 BaseObject 类 那么我可以使用具有泛型类型约束的方法 publ
  • Payu付款错误“发生一些错误,请重试!”

    我已经通过官方文档将 payu 集成到我的 Android 应用程序中https www payumoney com dev guide mobilecheckout android html prereq 我面临的问题是我的代码与测试凭据
  • 检测 FFT 图中的峰值

    I was wondering how is it possible to detect new peaks within an FFT plot in Python let s say i have this simple Plot An
  • Android:如何阻止 Android 1.6+ 缩放图像

    我更新了我的构建以针对 Android 1 6 构建 现在我的位图在高密度屏幕上按比例缩小 我不想要这种行为 我试了一下 http blog tomgibara com post 190539066 android unscaled bit
  • 如何返回 tkinter 中作为命令给出的函数的值

    我用 python 写了一个非常简单的代码tkinter 它包含一个输入框 我想将用户插入的值保留给我自己 以备以后需要使用它 这是代码 import tkinter as tk root tk Tk root geometry 600x4
  • 将表从 Amazon RDS 导出到 CSV 文件

    我有一个 MySQL 数据库正在运行亚马逊RDS 我想知道如何将整个表导出为 CSV 格式 我目前在 Windows 上使用 MySQL 服务器来查询 Amazon 数据库 但是当我尝试运行导出时出现错误 可能是因为没有适用于 amazon
  • MvcTextTemplateHost 是什么以及在哪里可以找到

    我想知道这是什么MvcTextTemplateHost 我的 create tt 中有这个 但我无法在 bin 文件夹中找到它 使用对象查看器搜索 我读了一下 发现它在我的 VisualStudio Extensions web dll 但
  • R 行乘法 - 重新设计? [复制]

    这个问题在这里已经有答案了 比如说 如果我有一个 lots x 5 矩阵和一个 1 x 5 矩阵 是否有比这更好的方法将它们逐行相乘 gt q 1 2 3 4 5 1 1 2 3 4 5 gt z 1 2 3 4 5 1 1 6 11 16
  • 如何给 iframe 100% 高度[重复]

    这个问题在这里已经有答案了 我想 但它仍然没有调整它的大小 当我尝试以像素为单位的高度时 它起作用了 编辑 100 似乎可以在 IE 上运行 但不能在 Firefox 上运行 你可以用 CSS 来做到这一点 请注意 默认情况下 这会将其放置
  • Android中如何知道定位模式是WIFI还是2G/3G基站?

    我们知道Android中有两种定位模式 GPS和网络 如果我们使用网络 那么Android可以使用WIFI或2G 3G基站进行定位 如果没有GPS 我们可以简单地使用LocationManager NETWORK PROVIDER来获取位置
  • 信号量和条件的区别(ReentrantLock)

    有谁知道这些方法之间的区别acquire and release java util concurrent Semaphore and await and signal new ReentrantLock newCondition 您能为每
  • Python 列表推导式 - 转置

    我刚刚开始通过阅读列表理解矩阵转置教程在这里 我理解这个例子 但我试图找出一种转置矩阵的方法 而不需要对范围进行硬编码 matrix 1 2 3 4 5 6 7 8 9 10 11 12 lcomp row i for row in mat
  • 通过导航 doPostBack 使用 R 抓取网站

    我想定期从下面的站点提取表格 单击构建块名称 BLOK 16 A BLOK 16 B BLOK 16 C 时 价目表会发生变化 URL不改变 页面通过触发改变 javascript doPostBack ctl00 ContentPlace
  • Spark SQL saveAsTable 返回空结果

    我使用以下代码在 Spark SQL 中创建 插入数据到 Hive 表中 val sc SparkSession builder appName App master local 2 config spark sql warehouse d
  • quote_ident() 不会向列名“first”添加引号

    我需要获得正确用双引号引起来的列名 quote ident 好像没有做到吧 select 1 first fails select quote ident first produces first not first 我可以使用什么命令来成