Postgresql 从xml插入多条记录
我希望大容量插入到PostgreSQL数据库中:后端代码将创建类似XML的XMLPostgresql 从xml插入多条记录,postgresql,xpath,Postgresql,Xpath,我希望大容量插入到PostgreSQL数据库中:后端代码将创建类似XML的XML <items> <i dt="2014-08-01" name="vvv" count="12" /> <i dt="2014-08-02" name="zzz" count="6" /> </items> 现在,最后我希望temp_值有3条记录,就像在XML中一样,但是表是空的 如果注释掉insert into行,您将看到值被正确解析。它只是返回一条记
<items>
<i dt="2014-08-01" name="vvv" count="12" />
<i dt="2014-08-02" name="zzz" count="6" />
</items>
现在,最后我希望temp_值有3条记录,就像在XML中一样,但是表是空的
如果注释掉insert into行,您将看到值被正确解析。它只是返回一条记录,其中每列都是一个数组,而不是返回多条记录
我遗漏了什么?很显然,数组索引是解决方案:
unnestarray |将数组展开为一组行
所以代码应该是
CREATE TEMP TABLE temp_values (dt date, name varchar, count int) ON COMMIT DROP;
WITH x AS (SELECT '
<items>
<i dt="2014-08-01" name="vvv" count="12" />
<i dt="2014-08-02" name="zzz" count="6" />
<i dt="2014-08-03" name="bbd" count="10" />
</items>'::xml AS t
)
INSERT INTO temp_values
SELECT
CAST(CAST((xpath('//@dt', node))[1] as varchar) as date),
CAST((xpath('//@name', node))[1] as varchar),
CAST(CAST((xpath('//@count', node))[1] as varchar) as int)
FROM (SELECT unnest(xpath('/items/i', t)) AS node FROM x) sub;
SELECT * FROM temp_values
我希望在@之前删除一些额外的斜杠:
CREATE TEMP TABLE temp_values (dt date, name varchar, count int) ON COMMIT DROP;
WITH x AS (SELECT '
<items>
<i dt="2014-08-01" name="vvv" count="12" />
<i dt="2014-08-02" name="zzz" count="6" />
<i dt="2014-08-03" name="bbd" count="10" />
</items>'::xml AS t
)
INSERT INTO temp_values
SELECT
CAST(CAST((xpath('@dt', node))[1] as varchar) as date),
CAST((xpath('@name', node))[1] as varchar),
CAST(CAST((xpath('@count', node))[1] as varchar) as int)
FROM (SELECT unnest(xpath('/items/i', t)) AS node FROM x) sub;
SELECT * FROM temp_values
CREATE TEMP TABLE temp_values (dt date, name varchar, count int) ON COMMIT DROP;
WITH x AS (SELECT '
<items>
<i dt="2014-08-01" name="vvv" count="12" />
<i dt="2014-08-02" name="zzz" count="6" />
<i dt="2014-08-03" name="bbd" count="10" />
</items>'::xml AS t
)
INSERT INTO temp_values
SELECT
CAST(CAST((xpath('@dt', node))[1] as varchar) as date),
CAST((xpath('@name', node))[1] as varchar),
CAST(CAST((xpath('@count', node))[1] as varchar) as int)
FROM (SELECT unnest(xpath('/items/i', t)) AS node FROM x) sub;
SELECT * FROM temp_values