本文為您介紹即時數倉Hologres相關的JSON函數。
GET_JSON_OBJECT
文法
GET_JSON_OBJECT用於解析JSON對象。在使用GET_JSON_OBJECT函數前,需要先建立載入擴充(Extension),詳情請參見Extension擴充。
--建立Extension CREATE EXTENSION IF NOT EXISTS hive_compatible SCHEMA <schema_name>; SELECT get_json_object ( json_string, path );
參數說明
參數
描述
json_string
JSON物件變數,TEXT類型。格式為合法JSON格式字串。
path
JSON內層對象訪問變數。使用
$
表示JSON變數標識,通過.
或[]
讀取JSON內層對象或數組。如果您輸入的JSON字串無效,則系統返回NULL。
樣本
準備樣本資料。
--建立Extension CREATE EXTENSION IF NOT EXISTS hive_compatible SCHEMA pg_catalog; --準備樣本資料 BEGIN; CREATE TABLE hive_json_example ( col_json text ); COMMIT; INSERT INTO hive_json_example VALUES ('{"store":{"fruit":[{"weight":8,"type":"apple"}, {"weight":9,"type":"pear"}],"bicycle":{"price":19.95,"color":"red"}},"email":"amy@only_for_json_udf_test.net","owner":"amy"}');
樣本1:從
col_json
列中查詢JSON對象中$.owner
路徑下的資料。--返回結果為:amy SELECT get_json_object (col_json, '$.owner') FROM hive_json_example;
樣本2:從
col_json
列中查詢JSON對象中$.store.bicycle.price
路徑下的資料。--返回結果為:19.95 SELECT get_json_object (col_json, '$.store.bicycle.price') FROM hive_json_example;
樣本3:從
col_json
列中查詢JSON對象中$.store.fruit
路徑下fruit
數組的第一個元素(索引為0)。-- 返回結果為:{"weight":8, "type":"apple"} SELECT get_json_object (col_json, '$.store.fruit[0]') FROM hive_json_example;
樣本4:查看非JSON物件變數的資料。
--傳回值為:NULL SELECT get_json_object (col_json, '$.no_key') FROM hive_json_example;
ROW_TO_JSON
ROW_TO_JSON函數支援將多個字串或列(最多50列)拼接成一個JSON並返回。
僅Hologres V1.3及以上版本支援ROW_TO_JSON函數,若想要使用該函數您可以通過加入即時數倉Hologres交流群申請升級執行個體或執行個體升級,加群方式請參見如何擷取更多的線上支援?。
文法
SELECT ROW_TO_JSON(record)
參數說明
record:是一個行類型的參數,可以是表名、視圖名或者查詢結果。
樣本
--準備測試資料 CREATE TABLE interests_test ( name text, intrests text ); INSERT INTO interests_test VALUES ('張三', '唱歌,跳舞'), ('李四', '踢球,跑步,畫畫'), ('王五', '插花,書法,彈琴,睡覺'); SELECT ROW_TO_JSON(t) FROM ( SELECT name, intrests FROM interests_test) AS t;
Hologres從V1.3.52版本開始,JSON中的Key支援根據列名產生。
V1.3.52以下版本返回結果如下。
row_to_json ------------------------------ {"f1":"張三","f2":"唱歌,跳舞"} {"f1":"李四","f2":"踢球,跑步,畫畫"} {"f1":"王五","f2":"插花,書法,彈琴,睡覺"}
V1.3.52及以上版本返回結果如下。
row_to_json ------------------------------ "{"name" : "王五", "intrests" : "插花,書法,彈琴,睡覺"}" "{"name" : "張三", "intrests" : "唱歌,跳舞"}" "{"name" : "李四", "intrests" : "踢球,跑步,畫畫"}"
常見報錯
報錯:
ERROR:function get_json_object (text, unknown) does not exist
。可能原因一
在SLPM模式下RAM使用者沒有建立extension所在Schema的查詢許可權(例如extension指定建立在名稱為public的Schema下,RAM使用者沒有public的查詢許可權)。
解決方案一
授予RAM使用者Schema的查詢許可權。
使用如下命令重新建立extension在pg_catalog下,所有帳號都可查詢。
DROP EXTENSION hive_compatible; CREATE EXTENSION hive_compatible schema pg_catalog;
可能原因二
GET_JSON_OBJECT的第一個參數不是TEXT類型。
解決方案二
將第一個參數轉換為TEXT類型。
報錯:
ERROR: get_json_object for fe, should not be evaluated
。可能原因一
GET_JSON_OBJECT的第一個參數是常量。
解決方案一
第一個參數使用表的列。
可能原因二
GET_JSON_OBJECT的第一個參數含有為NULL的值。
解決方案二
將第一個參數為NULL的值刪除。