我试图在PostgreSQL中的表中插入一些JSON数据。
JSON DATA: { "wsgi.multiprocess": true, "HTTP_REFERER": "http://localhost:9000/" }
因此,为此,我正在执行以下步骤:
CREATE TABLE TEST (MULTIPROCESS VARCHAR(20), HTTP_REFERER VARCHAR(50)); INSERT INTO TEST SELECT * FROM json_populate_record(NULL::test, '{"wsgi.multiprocess": true,"HTTP_REFERER": "http://localhost:9000/"}');
第一步创建一个表,而下一个步骤应将JSON数据插入表中。该查询成功完成,但是当我尝试查看表中的数据时,它只是一个管道。
这是输出:
有人知道为什么这样的输出吗?知道我应该怎么做才能纠正这个问题吗?
首先,在postgresql中,如果您确实希望将字段名和表名都大写,则需要创建表,如下所示:
CREATE TABLE "TEST" ("MULTIPROCESS" VARCHAR(20), "HTTP_REFERER" VARCHAR(50));
然后查询将像:
SELECT * FROM json_populate_record(NULL::"TEST", '{"wsgi.multiprocess": true,"HTTP_REFERER": "http://localhost:9000/"}'); MULTIPROCESS | HTTP_REFERER --------------+------------------------ | http://localhost:9000/
如您所见,由于json和sql表中的字段名称不匹配,因此multiprocess保留为空白。要摆脱这种情况,您可以执行外部脚本或postgresql函数。
例如:
CREATE OR REPLACE FUNCTION replace_json_keys(IN js TEXT) RETURNS json STABLE AS $$ BEGIN js := replace(js, '"wsgi.multiprocess"', '"MULTIPROCESS"'); return js::json; END; $$ LANGUAGE 'plpgsql';
然后,您可以执行以下操作:
SELECT * FROM json_populate_record(NULL::"TEST", replace_json_keys('{"wsgi.multiprocess": true,"HTTP_REFERER": "http://localhost:9000/"}')); MULTIPROCESS | HTTP_REFERER --------------+------------------------ true | http://localhost:9000/
但是,最好的解决方案不是使用replace()而是json_each()将键和值拆分为两个数组,使用“ case when”进行循环以将json键映射到sql键,然后返回一个新的json。json_object(keys[], values[])准备插入的对象(带有)。
replace()
json_each()
json_object(keys[], values[])