PostgreSQL 15 JSON 函数增强

【更新】这些 JSON 函数增强被推迟了,最终没有包含在 Postgresql 15 版本中,期待后续版本。

PostgreSQL 15 Beta 1 版已经发布,正式版预计 2022 年下半年推出。新版本为开发者提供了许多新功能,例如新的 MERGE 语句、JSON 以及正则表达式函数的增强。

早在 2012 年发布的 Postgresql 9.2 版本就引入了 JSON 支持,而 sql/JSON 标准比这个时间晚了五年。Postgresql 15 增加了更多的标准 SQL/JSON 函数包括 sql/JSON 构造函数查询函数以及将 JSON 数据转换为表的能力。

sql/JSON 构造函数

Postgresql 新版本增加sql/JSON 构造函数包括

  • JSON()
  • JSON_SCALAR()
  • JSON_SERIALIZE()
  • JSON_ARRAY()
  • JSON_ARRAYAGG()
  • JSON_OBJECT()
  • JSON_OBJECTAGG()

这些函数比已有的 JSON 函数功能更强大,例如:

select json('"json"');
   json   
----------
 "json"
 
select json('[1,2,3]');
  json   
---------
 [1,2,3]

select json('{"a": 123,"b": [true,"foo"],"a": "bar"}' with unique keys);
ERROR:  duplicate JSON object key value

select json_array( 1, '2022', 'json' );
          json_array           
-------------------------------
 [1, "2022", "json"]

select json_arrayagg(datname order by datname) from pg_database;
                       json_arrayagg                       
-----------------------------------------------------------
 ["hrdb", "postgres", "template0", "template1"]

select json_object( 'id': 1, 'aid': json_array(1,3));
         json_object          
------------------------------
 {"id" : 1, "aid" : [1, 2, 3]}

select json_objectagg( datname: oid) from pg_database;
                                          json_objectagg                                           
---------------------------------------------------------------------------------------------------
 { "hrdb" : "16668", "postgres" : "14617", "template0" : "14616", "template1" : "1" }

其中,JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 是聚合函数,可以将数据聚合成 JSON 数组和对象。

IS JSON 谓词

IS JSON 谓词可以用于测试数据是否满足 JSON 数据格式,返回结果为 t 或者 f。具体包括

  • IS [NOT] JSON [VALUE]
  • IS [NOT] JSON ARRAY
  • IS [NOT] JSON OBJECT
  • IS [NOT] JSON SCALAR
  • IS [NOT] JSON WITH | WITHOUT UNIQUE KEYS

例如:

SELECT
    js,
    js IS JSON "is json",
    js IS NOT JSON "is not json",
    js IS JSON SCALAR "is scalar",
    js IS JSON OBJECT "is object",
    js IS JSON ARRAY "is array"
FROM
    (VALUES ('123'), ('"abc"'), ('{"a": "b"}'), ('[1,2]'), ('abc')) foo(js);

     js     | is json | is not json | is scalar | is object | is array
------------+---------+-------------+-----------+-----------|-------------
 123        | t       | f           | t         | f         | f
 "abc"      | t       | f           | t         | f         | f
 {"a": "b"} | t       | f           | f         | t         | f
 [1,2]      | t       | f           | f         | f         | t
 abc        | f       | t           | f         | f         | f
(5 rows)

sql/JSON 查询函数

sql/JSON 查询函数用于查询 JSON 数据中的指定节点,节点通过 JSON 路径表达式指定。新版本增加查询函数包括

  • JSON_EXISTS()
  • JSON_QUERY()
  • JSON_VALUE()

JSON_EXISTS() 函数用于判断指定的路径上是否存在 JSON 数据,例如:

select json_exists( '{"id":123}'::jsonb, '$.id' ), json_exists( '{"id":123}'::jsonb, '$.aid' );
 json_exists | json_exists 
-------------+-------------
 t           | f

JSON_QUERY() 函数用于返回指定路径上的 JSON 数据,例如:

select json_query('[{"x": "aaa"},{"x": "bbb"},{"x": "ccc"}]'::jsonb, '$[1].x' );
 json_query 
------------
 "bbb"

JSON_VALUE() 函数用于将指定路径上的 JSON 元素转换为标量值,例如:

SELECT JSON_VALUE('"123.45"', '$' RETURNING float);
 json_value
------------
     123.45

JSON_TABLE 函数

JSON_TABLE 函数用于将 JSON 数据转换为 sql 表数据。这是一个很强大的转换函数,我们看一个简单的示例:

select * from json_table(
    '[{"a":10,"b":20},{"a":30,"b":40}]'::jsonb,
    '$[*]'
    COLUMNS (
        column_a int4 path '$.a',
        column_b int4 path '$.b'
    )
);
 column_a | column_b 
----------+----------
       10 |       20
       30 |       40

总结

Postgresql 15 增加了大量符合 sql/JSON 标准的函数,使得 JSON 数据的处理更加简单。

Postgresql = sql + Nosql

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...