更新时间:2025-10-23 GMT+08:00

行表达式

行比较允许使用以下操作符=、<>、<、<=、>、>=。暂不支持<=>等操作符,或其中一个相似的语义符。

语法如下:

row_constructor operator row_constructor
  • 操作符两边都是一个行构造器,两行值必须具有相同数目的字段,每一行都进行比较。
  • 支持的数据类型和比较操作符一致。

<、<=、>、>=

在<、<=、>、>=的情况下,行中元素从左到右依次比较,直到遇到一对不相等的元素或者一对为空的元素。如果这对元素中存在至少一个null值,则比较结果是未知的null,否则这对元素的比较结果为最终的结果。如果最终没有匹配到不相等或者为空的元素,则认为这两行值相等,根据操作符含义判断最终结果。

示例:

m_db=# SELECT (1,2,NULL) < (1,3,0) AS RESULT;
  result
----------
 t
(1 row)

m_db=# SELECT (4,5,6) > (3,2,1) AS RESULT;
 result 
--------
 t
(1 row)

m_db=# SELECT (4,1,1) > (3,2,1) AS RESULT;
 result 
--------
 t
(1 row)

m_db=# SELECT ('TEST','DATA') > ('DATA','DATA') AS RESULT;
 result 
--------
 t
(1 row)

m_db=# SELECT (4,1,1) > (3,2,NULL) AS RESULT;
 result 
--------
 t
(1 row)

m_db=# SELECT (NULL,1,1) > (3,2,1) AS RESULT;
 result 
--------

(1 row)

m_db=# SELECT (NULL,5,6) > (NULL,5,6) AS RESULT;
 result 
--------

(1 row)

m_db=# SELECT (4,5,6) > (4,5,6) AS RESULT;
 result 
--------
 f
(1 row)

m_db=# SELECT (2,2,5) >= (2,2,3) AS RESULT;
 result 
--------
 t
(1 row)

m_db=# SELECT (2,2,1) <= (2,2,3) AS RESULT;
 result 
--------
 t
(1 row)

=、<>

=、<>和别的操作符使用略有不同。如果两行值的所有字段都是非空并且符合操作符条件,则认为两行是符合操作符条件的;如果两行值的任意字段为非空并且不符合操作符条件,则认为两行是不符合操作符条件的;如果两行值的任意字段为空,则比较的结果是未知的null。

示例:

m_db=# SELECT (1,2,3) = (1,2,3) AS RESULT;
 result 
--------
 t
(1 row)

m_db=# SELECT (1,2,3) <> (2,2,3) AS RESULT;
 result 
--------
 t
(1 row)

m_db=# SELECT (2,2,3) <> (2,2,NULL) AS RESULT;
 result 
--------

(1 row)

m_db=#  SELECT (NULL,5,6) <> (NULL,5,6) AS RESULT;
 result 
--------

(1 row)