【问题标题】:Row constructor comparison行构造函数比较
【发布时间】:2020-08-27 18:11:26
【问题描述】:

在简单的场景中:

SELECT (1,2) = (1,NULL)
-- NULL

比较时:

SELECT ((1,2),1) = ((1,CAST(NULL AS INT)),1)
-- NULL        MariaDB/MySQL
-- False       PostgreSQL

SELECT ((1,2),CAST(NULL AS INT)) = ((1,CAST(NULL AS INT)),1)
-- NULL        MariaDB/MySQL
-- False       PostgreSQL

db<>fiddle PostgreSQL

db<>fiddle MariaDB


来自 PostgreSQL 文档:

Row Constructor Comparison

= 和 情况与其他情况略有不同。如果两行的所有对应成员都不为空且相等,则认为两行相等; 如果任何对应的成员不为空且不相等,则行不相等;否则行比较的结果是未知的(null)。

PostgreSQL 是否以不同的方式处理“嵌套”记录/行类型?根据 SQL 标准(MariaDB/PostgreSQL/两者),哪个结果是正确的?

【问题讨论】:

  • 性能:直到最近,MySQL/MariaDB 在行构造函数方面做得很差。

标签: mysql postgresql mariadb


【解决方案1】:

MySQL 和 Postgre 将 NULL 值与IS 进行比较,其他的都是undefined

见https://www.postgresql.org/docs/9.1/functions-comparison.html

并且mysql确实喜欢标准sql定义它

但正如您在 Mysql 和 mariadb 中看到的那样,可以比较 NULL <=>

SELECT (1,2) <=> (1,NULL)
| (1,2) (1,NULL) | | -----------------: | | 0 |
SELECT ((1,2),1) <=> ((1,CAST(NULL AS INT)),1)
| ((1,2),1) ((1,CAST(NULL AS INT)),1) | | --------------------------------------------------: | | 0 |
SELECT ((1,2),1) <=> ((1,NULL),1)
| ((1,2),1) ((1,NULL),1) | | -------------------------: | | 0 |
SELECT ((1,2),CAST(NULL AS INT)) <=> ((1,CAST(NULL AS INT)),1)
| ((1,2),CAST(NULL AS INT)) ((1,CAST(NULL AS INT)),1) | | -------------------------------------------------- ----: | | 0 |
SELECT ((1,2),null) <=> ((1,null),1)
| ((1,2),null) ((1,null),1) | | ----------------------------------------: | | 0 |

db小提琴here

对于SELECT ((1,2),CAST(NULL AS INT)) = ((1,CAST(NULL AS INT)),1),我没有解释,如果将CAST(NULL AS INT)定义为0而不是NULL,但我找不到任何解释,但由于它是确定性的,所以应该提一下哪里都有,但是没找到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    相关资源
    最近更新 更多