ITPub博客

首页 > 数据库 > PostgreSQL > PostgreSQL对SQL:2023标准支持情况

PostgreSQL对SQL:2023标准支持情况

原创 PostgreSQL 作者:u_aa03cac0d7fc 时间:2024-04-06 11:14:22 0 删除 编辑

关于SQL:2023标准的分类介绍,Peter Eisentraut在这篇文章有详细的示范说明:

https://peter.eisentraut.org/blog/2023/04/04/sql-2023-is-finished-here-is-whats-new

文章对SQL:2023标准进行了分析,并归类了三方面的变化:

  1. 当前SQL语言的一些小变更
  2. JSON相关的功能特性
  3. 新引入图查询的接口

文章围绕这三方面进行了示例说明,同时作者又紧接着分析了PostgreSQL数据库对SQL:2023标准的支持情况,参考文章如下:

https://peter.eisentraut.org/blog/2023/04/18/postgresql-and-sql-2023

SQL:2023标准 PostgreSQL支持情况
UNIQUE null treatment (F292) PostgreSQL 15
ORDER BY in grouped table (F868) ancient
GREATEST and LEAST (T054) ancient
String padding functions (T055) ancient
Multi-character TRIM functions (T056) ancient
Optional string types maximum length (T081) ancient
Enhanced cycle mark values (T133) PostgreSQL 14
ANY_VALUE (T626) PostgreSQL 16
Non-decimal integer literals (T661) PostgreSQL 16
Underscores in numeric literals (T662) PostgreSQL 16
JSON data type (T801) PostgreSQL 9.2/9.4
Enhanced JSON data type (T802) future
String-based JSON (T803) not planned
Hex integer literals in SQL/JSON path language (T840) PostgreSQL 16
SQL/JSON simplified accessor (T860–T864) future
SQL/JSON item methods (T865–T878) future
JSON comparison (T879–T882) PostgreSQL 9.4
Property Graph Queries future

备注:

  • ancient:PostgreSQL 10之前已支持,广泛使用中。
  • not planned:社区可能觉得该功能已过时,没有价值做。
  • future:未来的版本准备做。

下面简要介绍14~16版本支持的特性

Enhanced cycle mark values (T133)

PostgreSQL 14对递归查询语句增加了两个新特性: SEARCH和CYCLE。

WITH RECURSIVE ... (    SELECT ...      UNION ALL
    SELECT ...
)CYCLE id SET is_cycle USING path;

使用CYCLE选项,用于标记循环,进行检测来避免循环,CYCLE和SEARCH选项可以更灵活控制搜索模式并避免出现死循环问题。

UNIQUE null treatment (F292)

长期以来,在PostgreSQL里NULL空对象是允许重复的,如果使用唯 一约束一般同时加上非空约束。这样可以避免插入多个NULL空对象。

但如果允许插入NULL对象, 有且仅有一个NULL对象,在15以前可以使用部分表达式索引来实现:

CREATE UNIQUE INDEX  ON tab ((column is null)) WHERE column IS NULL;

使用where条件对null值创建了唯 一索引并存储为true值。

在PostgreSQL 15里,可以对NULL空对象是否重复进行语法控制:

UNIQUE NULLS DISTINCT 
UNIQUE NULLS NOT  DISTINCT

使用示例如下:

image.png

Non-decimal integer literals (T661)

PostgreSQL对字符串常量的形式支持非常丰富,然而对数字类型常量表示形式比较少,PostgreSQL 16实现了十六进制、八进制、二进制形式的整型常量,非十进制的表示形式可以更容易阅读和理解代码。

十进制形式

SELECT 1234;

十六进制形式

SELECT 0x4D2 hex_int;

八进制形式

SELECT 0o2322 oct_int;

二进制形式

SELECT 0b10011010010 bin_int;

image.png

Underscores in numeric literals (T662)

PostgreSQL 16可以使用下划线对整型和数字常量进行虚拟分组,示例如下:

用于测试函数

SELECT count(*) FROM generate_series(1, 1_000_000);

用于查询条件

SELECT ... WHERE a > 0 and a < 3.14159_26535_89793/2;

用于更新值

UPDATE ... SET x = 0x_FFFF_FFFF ...

ANY_VALUE (T626)

PostgreSQL 16实现的any_value函数可以对分组后的数据去重只返回单行。

例如下面这张人员表,按部门编号各有两行数据:

postgres=# table person;┌────────┬─────────────┐
│ deptno │    name     │
├────────┼─────────────┤
│     10 │ dept1_name1 │
│     10 │ dept1_name2 │
│     20 │             │
│     20 │ dept2_name2 │
└────────┴─────────────┘
(4 rows)

查询person表,每个部门获取一位人员,分组查询使用any_value函数,部门编号为10返回上面的第一行数据,部门编号为20跳过空行返回第四行数据。

postgres=# SELECT deptno, any_value(name) FROM person GROUP BY deptno;
 deptno |  any_value  
--------+-------------
     10 | dept1_name1
     20 | dept2_name2
(2 rows)

使用any_value聚合函数时也可以指定排序,下面按name降序返回数据,部门编号为10返回最上面的第二行数据。

postgres=# SELECT deptno, any_value(name order by name desc) 
           FROM person 
           GROUP BY deptno;
 deptno |  any_value  
--------+-------------
     10 | dept1_name2
     20 | dept2_name2
(2 rows)

保持联系

本人组建了一个技术交流群:PG乐知乐享交流群。欢迎关注文章的小伙伴随缘加入,进群请加本人微信skypkmoon并备注PG乐知乐享。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69978456/viewspace-3011564/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-06-12

  • 博文量
    102
  • 访问量
    50375