我在PostgreSQL存储过程中将记录字段定义为区分大小写时遇到问题。我将我的记录定义为:
CREATE TYPE json_record AS (
"objectType" text ,
"objectSubtype" text
};
我需要字段区分大小写的原因是因为记录是从存储过程中的JSON填充的,而我无法控制JSON内容
我的存储过程是:
CREATE OR REPLACE FUNCTION record(id uuid, json_in json) RETURNS void AS $$
DECLARE
raw_record json_record;
BEGIN
SELECT json_populate_record( NULL::json_record, json_in) INTO raw_record;
INSERT INTO my_resource (uuid, type, subtype)
SELECT (id, raw_record.objectType, raw_record.objectSubtype);
END;
$$ LANGUAGE plpgsql VOLATILE;
当我执行程序时,我收到错误:
ERROR: record "raw_record" has no field "objecttype"
我理解错误的原因:“json_record”是使用区分大小写的字段定义的,但PostgreSQL的执行引擎将raw_record.objectType和raw_record.objectSubtype转换为raw_record.objecttype和raw_record.objectsubtype。问题是如何避免这种情况并强制记录的字段被视为区分大小写。我能想到的唯一解决方案是使用动态SQL,逐段构建查询并将字段包装在quote_ident()中,但我想知道是否有更简单的解决方案来强制执行记录的区分大小写?
答案 0 :(得分:0)
强制记录的字段被视为区分大小写
与使用区分大小写的标识符的方式相同:您需要将它们用双引号括起来。您也不需要插入SELECT
子句:
INSERT INTO my_resource (uuid, type, subtype)
VALUES (id, raw_record."objectType", raw_record."objectSubtype");
作为旁注:select (a,b,c)
不您认为它的作用。它选择一个单个列作为匿名记录(包含三个字段)。它不会选择三列。因此,如果您确实想要使用select
版本而不是values
,则必须删除括号:
INSERT INTO my_resource (uuid, type, subtype)
SELECT id, raw_record."objectType", raw_record."objectSubtype";