2015-03-30 28 views
0

我在PostgreSQL存儲過程中將記錄的字段定義爲區分大小寫時遇到問題。我定義我的記錄爲:在PotgreSQL存儲過程中使記錄字段區分大小寫

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

force record's fields to be treated as case sensitive

與總是使用區分大小寫的標識符相同的方式:您需要將它們用雙引號括起來。你也並不真的需要一個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"; 
+0

@a_horse_with_no_nameThank你了。我沒有意識到我可以用這種方式加雙引號。你的建議解決了我的問題 – MrkK 2015-03-30 20:04:29

相關問題