暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

openGauss的比较表达式

wang 2023-04-18
291

一、常用的比较操作符:

示例1:阶乘操作符类型解析。在系统表中里只有一个阶乘操作符(后缀!),它以bigint作为参数。扫描器给下面查询表达式的参数赋予bigint的初始类型:

openGauss=# SELECT 40 ! AS "40 factorial";

40 factorial
--------------------------------------------------
815915283247897734345611269596115894272000000000
(1 row)

分析器对参数做类型转换,查询等效于:

openGauss=# SELECT CAST(40 AS bigint) ! AS "40 factorial";


示例2:字符串连接操作符类型分析。一种字符串风格的语法既可以用于字符串也可以用于复杂的扩展类型。未声明类型的字符串将被所有可能的候选操作符匹配。有一个未声明的参数的例子:

openGauss=# SELECT text 'abc' || 'def' AS "text and unknown";
text and unknown
------------------
abcdef
(1 row)

本例中分析器寻找两个参数都是text的操作符。确实有这样的操作符,两个参数都是text类型。

下面是连接两个未声明类型的值:

openGauss=# SELECT 'abc' || 'def' AS "unspecified";
unspecified
-------------
abcdef
(1 row)

说明:

因为查询中没有声明任何类型,所以本例中对类型没有任何初始提示。因此,分析器查找所有候选操作符,发现既存在接受字符串类型范畴的操作符也存在接受位串类型范畴的操作符。因为字符串类型范畴是首选,所以选择字符串类型范畴的首选类型text作为解析未知类型文本的声明类型。


示例3:绝对值和取反操作符类型分析。openGauss操作符表里面有几条记录对应于前缀操作符@,它们都用于为各种数值类型实现绝对值操作。其中之一用于float8类型,它是数值类型范畴中的首选类型。因此,在面对unknown输入的时候, openGauss会使用该类型:

openGauss=# SELECT @ '-4.5' AS "abs";
abs
-----
4.5
(1 row)

此处,系统在应用选定的操作符之前隐式的转换unknown类型的文字为float8类型。


示例4:数组包含操作符类型分析。这里是解决一个操作符带有一个已知和一个未知类型输入的例子:

openGauss=# SELECT array[1,2] <@ '{1,2,3}' as "is subset";
is subset
-----------
t
(1 row)

说明:

openGauss操作符表有几条记录对应于中缀操作符<@,但是只有两个可以在左侧接受一个整数数组的操作符是数组包含(anyarray <@ anyarray) 和范围包含(anyelement <@ anyrange)的。因为没有多态的伪类型(参阅伪类型)是首选的,所以解析器不能解决这个基础上的歧义。然而,最后一个解析规则告诉用户,假设未知类型的文字是和另外一个输入相同的类型,也就是,整数数组。现在只有两个操作符中的一个可以匹配,所以选择数组包含。(如果用户选择了范围包含,用户将得到一个错误,因为字符串没有正确的格式成为范围的文字。)


二、除比较操作符外,还可以使用以下句式结构:

  • BETWEEN操作符

    a BETWEEN x AND y等效于a >= x AND a <= y

    a NOT BETWEEN x AND y等效于a < x OR a > y

  • 检查一个值是不是null,可使用:

    expression IS NULL

    expression IS NOT NULL

    或者与之等价的句式结构,但不是标准的:

    expression ISNULL

    expression NOTNULL

须知:不要写expression=NULL或expression<>(!=)NULL,因为NULL代表一个未知的值,不能通过该表达式判断两个未知值是否相等。

  • is distinct from/is not distinct from

    • is distinct from

      A和B的数据类型、值不完全相同时为true。

      A和B的数据类型、值完全相同时为false。

      将空值视为相同。

    • is not distinct from

      A和B的数据类型、值不完全相同时为false。

      A和B的数据类型、值完全相同时为true。

      将空值视为相同。

  • <=> 安全等于操作符

    在 '=' 比较的基础上增加NULL值的比较,在操作符左右值都不为NULL时与 '=' 结果相同。

    A和B的数据类型、值不完全相同时为false。

    A和B的数据类型、值完全相同时为true。

    将空值视为相同。


说明:<=>操作符与 is not distinct from 用法完全相同。    该操作符仅在openGauss兼容MY类型时(即sql_compatibility = 'B')有效,其他类型不支持该操作符。


三、伪列

ROWNUM

ROWNUM是一个伪列,它返回一个数字,表示从查询中获取结果的行编号。第一行的ROWNUM为1,第二行的为2,依此类推。

ROWNUM的返回类型为numeric。ROWNUM可以用于限制查询返回的总行数,例如下面语句限制查询从Students表中返回最多10条记录。

select * from Students where rownum <= 10;



示例:

openGauss=# SELECT 2 BETWEEN 1 AND 3 AS RESULT;

result
----------
t
(1 row)

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

openGauss=# SELECT 2 NOT BETWEEN 1 AND 3 AS RESULT;
result
----------
f
(1 row)

openGauss=# SELECT 2 < 1 OR 2 > 3 AS RESULT;
result
----------
f
(1 row)

openGauss=# SELECT 2+2 IS NULL AS RESULT;
result
----------
f
(1 row)

openGauss=# SELECT 2+2 IS NOT NULL AS RESULT;
result
----------
t
(1 row)

openGauss=# SELECT 2+2 ISNULL AS RESULT;
result
----------
f
(1 row)

openGauss=# SELECT 2+2 NOTNULL AS RESULT;
result
----------
t
(1 row)

openGauss=# SELECT 2+2 IS DISTINCT FROM NULL AS RESULT;
result
----------
t
(1 row)

openGauss=# SELECT 2+2 IS NOT DISTINCT FROM NULL AS RESULT;
result
----------
f
(1 row)


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论