行表达式
语法如下:
row_constructor operator row_constructor
两边都是一个行构造器,两行值必须具有相同数目的字段,每一行都进行比较,行比较允许使用=,<>,<,<=,>=等操作符,或其中一个相似的语义符。
对于<,<=,>,> =的情况下,行中元素从左到右依次比较,直到遇到一对不相等的元素或者一对为空的元素。如果这对元素中存在至少一个null值,则比较结果是未知的(null),否则这对元素的比较结果为最终的结果。如果最终没有遇到不相等或者为空的元素,则认为这两行值相等,根据操作符含义判断最终结果。
不支持对XML类型数据操作。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
openGauss=# SELECT ROW(1,2,NULL) < ROW(1,3,0) AS RESULT; result ---------- t (1 row) openGauss=# select (4,5,6) > (3,2,1) as result; result -------- t (1 row) openGauss=# select (4,1,1) > (3,2,1) as result; result -------- t (1 row) openGauss=# select ('test','data') > ('data','data') as result; result -------- t (1 row) openGauss=# select (4,1,1) > (3,2,null) as result; result -------- t (1 row) openGauss=# select (null,1,1) > (3,2,1) as result; result -------- (1 row) openGauss=# select (null,5,6) > (null,5,6) as result; result -------- (1 row) openGauss=# select (4,5,6) > (4,5,6) as result; result -------- f (1 row) openGauss=# select (2,2,5) >= (2,2,3) as result; result -------- t (1 row) openGauss=# select (2,2,1) <= (2,2,3) as result; result -------- t (1 row) |
=,<>和别的操作符使用略有不同。如果两行值的所有字段都是非空并且符合操作符条件,则认为两行是符合操作符条件的;如果两行值的任意字段为非空并且不符合操作符条件,则认为两行是不符合操作符条件的;如果两行值的任意字段为空,则比较的结果是未知的(null)。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
openGauss=# select (1,2,3) = (1,2,3) as result; result -------- t (1 row) openGauss=# select (1,2,3) <> (2,2,3) as result; result -------- t (1 row) openGauss=# select (2,2,3) <> (2,2,null) as result; result -------- (1 row) openGauss=# select (null,5,6) <> (null,5,6) as result; result -------- (1 row) |