PostgreSQL JSON 数据类型用作 NOSQL,但 VIEW 作为关系数据结构

Phi*_*ord 2 nosql postgresql view relational-theory json

我可以从 JSON 数据类型创建 VIEW 但将其作为关系结构吗?

例子:

SELECT * 
FROM json_test;
Run Code Online (Sandbox Code Playgroud)

结果

[
    {
        "name": "Roy",
        "Country": "USA",
        "hobby": "Swim",
        "address": "Church Street",
        "sex": "M"
    },
    {
        "name": "Roy",
        "Country": "USA",
        "hobby": "Cricket",
        "address": "Amsterdam",
        "sex": "F"
    },
    {
        "name": "Anam",
        "country": "Greece",
        "hobby": "Polo",
        "address": "MG Road",
        "sex": "M"
    }
]
Run Code Online (Sandbox Code Playgroud)

然后创建 VIEW 将类似于(不确定是否/如何执行此操作)

CREATE VIEW normalized AS 
SELECT name, country, hobby, address, sex 
FROM JSON data 
Run Code Online (Sandbox Code Playgroud)

然后我可以用这样的东西查询视图

SELECT * 
FROM normalized
Run Code Online (Sandbox Code Playgroud)

结果集

name  | country | hobby   | address       | sex  
------+---------+---------+---------------+----
 Roy  | USA     | Swim    | Church Street | M
 Roy  | USA     | Cricket | Amsterdam     | F
 Anam | Greece  | Polo    | MG Road       | M
(3 rows)
Run Code Online (Sandbox Code Playgroud)

a_h*_*ame 5

由于 JSON 列中有多行,因此您需要一个返回集合的函数。这可以使用以下json_to_recordset()函数完成:

select j.*
from json_test, 
     json_to_recordset(json_data) as j(name text, country text, hobby text, address text, sex text);
Run Code Online (Sandbox Code Playgroud)

由于这是一种匿名记录类型,您必须明确定义每一列。如果你想把它放到一个视图中,可能不是什么大事。请注意,您的示例数据不会返回CountryJSON 数据中键的值,只会返回命名的值,country因为列名和 JSON 键之间的匹配区分大小写。

如果您不想创建视图,可以使用自定义类型缩短上述内容:

create type person_t as (name text, country text, hobby text, address text, sex text);

select j.*
from json_test, 
     json_populate_recordset(null::person_t, json_data) as j;
Run Code Online (Sandbox Code Playgroud)

SQLFiddle:http ://sqlfiddle.com/#!15/91b85/1