Sql 如何将JSON文件及其所有键加载到Postgres中?

Sql 如何将JSON文件及其所有键加载到Postgres中?,sql,json,postgresql,navicat,Sql,Json,Postgresql,Navicat,我有一个XML文件,它被分解成更小的表。我可以把它们全部加载到Navicat,除了一张桌子。 以下是XML结构: 100 肉 2020/12/20 2020/12/25 200 蔬菜 地下一层 我在Python中使用xmltodict将其转换为JSON: [{ “Id”:“100”, “类型”:“肉”, “有效期”:{ “鸡”:“2020/12/20”, “牛肉”:“2020/12/25” } }, { “Id”:“200”, “类型”:“蔬菜”, “营养”:“B1” }] 但是,当我将这

我有一个XML文件,它被分解成更小的表。我可以把它们全部加载到Navicat,除了一张桌子。 以下是XML结构:


100
肉
2020/12/20
2020/12/25
200
蔬菜
地下一层
我在Python中使用xmltodict将其转换为JSON:

[{
“Id”:“100”,
“类型”:“肉”,
“有效期”:{
“鸡”:“2020/12/20”,
“牛肉”:“2020/12/25”
}
},
{
“Id”:“200”,
“类型”:“蔬菜”,
“营养”:“B1”
}]

但是,当我将这个JSON文件加载到Navicat(PostgresSQL连接)时,SQL表模式只有Id、类型和有效期。如您所见,一个对象中缺少关键点,但其他对象中出现关键点。如何创建包含JSON文件中所有字段的SQL表?(Id、类型、有效期和营养)。

如果您没有特殊理由首先将其转换为JSON,那么您可以将XMLTABLE与“原始”嵌入式XML一起使用,如下所示:

选择*
从xmltable(“//Food”传递
xmlparse(文档'
100
肉
2020/12/20
2020/12/25
200
蔬菜
地下一层
')
柱
“Id”整数,
“类型”文本,
“ExpiryDate.Chicken”日期路径“ExpiryDate/Chicken”,
“ExpiryDate.Beef”日期路径“ExpiryDate/Beef”,
“营养”文本
);
和需要分别更改为和才能成为有效的标记名。结果是:

Id |Type        |ExpiryDate.Chicken|ExpiryDate.Beef|Nutrition|
---|------------|------------------|---------------|---------|
100| Meat       |        2020-12-20|     2020-12-25|         |
200| Vegetables |                  |               | B1      |
编辑简化的XML查询

如果需要JSON,则按照Laurenz Albe的建议:

选择
(j->>'Id')::整数Id,
j->>“类型”的“类型”,
(j->“到期日”->“鸡肉”):日期xdate_Chicken,
(j->“有效期”->“牛肉”):日期xdate_牛肉,
j->>“营养”营养
来自jsonb_数组_元素
('[{
“Id”:“100”,
“类型”:“肉”,
“有效期”:{
“鸡”:“2020/12/20”,
“牛肉”:“2020/12/25”
}
},
{
“Id”:“200”,
“类型”:“蔬菜”,
“营养”:“B1”
}]“)j;

我找到了解决这个问题的方法。使用Python,我通读XML文件以获得所有可能的列名,然后在每个列名中读入其子元素并在Postgres中将其作为jsonb写入。

在客户端解析JSON,并向数据库发出相应的
INSERT
语句。或者,使用
json\u array\u elements
->
操作符在数据库中执行此操作。非常感谢。然而,XML文件的元素比这多得多,过期日期内的节点也多得多且不可预测。此外,有超过5个元素类似于到期日。我怎样才能在不必手动列出所有列的情况下实现同样的目标呢?恐怕我不知道。但是,您可以使用
json\u object\u keys
提取元素名称列表,然后使用文本编辑器进行一些工作,以便更轻松地列出所有列,而不会出现(或更少)错误。顺便说一句,如果
到期日的结构是动态的,那么为什么不在表中将其作为json(B)列?这可能不是最方便使用的东西,但可能是最好的,至少你不会丢失数据。哦,这正是我几分钟前想到的哈哈哈。但是,如果我只是将确切的JSON文件加载到Postgres中,我将拥有jsonb类型,但将丢失营养字段。那么,为什么不使用混合结构、常规列(如id、类型、营养)和JSON中的结构化列(如到期日等)?这将给你最好的两个世界,即关键和细节。