【PostgreSQL】函数与操作符-比较函数和操作符

news/2024/7/9 20:46:35 标签: postgresql

PostgreSQL函数与操作符-比较函数和操作符

PostgreSQL中的比较函数和操作符

PostgreSQL中的比较函数和操作符用于比较两个表达式的值。它们的作用是确定表达式的值是否满足某种条件,例如等于、大于、小于等。

比较函数是一个接受两个参数的函数,返回一个布尔值,表示两个参数是否满足某种条件。例如,equal()函数用于判断两个参数是否相等,greater than()函数用于判断第一个参数是否大于第二个参数。

比较操作符是一种特殊的函数,使用符号表示,例如=表示等于,>表示大于,<表示小于等。比较操作符可以直接应用于表达式,返回一个布尔值。

比较函数和操作符在使用上有所不同。比较函数可以用于任意类型的表达式,而比较操作符只能用于特定类型的表达式。此外,比较函数更加灵活,可以自定义比较规则,而比较操作符的比较规则是固定的。

在使用比较函数和操作符时,可以通过组合多个比较条件来构建复杂的比较表达式。例如,可以使用AND、OR等逻辑操作符来连接多个比较条件,以实现更灵活的比较。

总的来说,比较函数和操作符在比较表达式的值时起到了关键作用,它们可以用于判断两个值的大小关系、相等关系等,并且可以根据需要进行灵活的组合和扩展。

PostgreSQL常见的比较操作符都可用,如下表所示。

操作符描述
<小于
>大于
<=小于等于
>=大于等于
=等于
<> or !=不等于

比较操作符可以用于所有可以比较的数据类型。所有比较操作符都是双目操作符,它们返回boolean类型;类似于1 < 2 < 3的表达式是非法的(因为没有<操作符可以比较一个布尔值和3)。

如下表所示,也有一些比较谓词。它们的行为和操作符很像,但是具有 SQL 标准所要求的特殊语法。

谓词描述
a BETWEEN x AND y在x和y之间
a NOT BETWEEN x AND y不在x和y之间
a BETWEEN SYMMETRIC x AND y在对比较值排序后位于x和y之间
a NOT BETWEEN SYMMETRIC x AND y在对比较值排序后不位于x和y之间
a IS DISTINCT FROM b不等于,空值被当做一个普通值
a IS NOT DISTINCT FROM b等于,空值被当做一个普通值
expressionIS NULL
expression IS NOT NULL不是空值
expression ISNULL是空值(非标准语法)
expression NOTNULL不是空值(非标准语法)
boolean_expression IS TRUE为真
boolean_expression IS NOT TRUE为假或未知
boolean_expression IS FALSE为假
boolean_expression IS NOT FALSE为真或者未知
boolean_expression IS UNKNOWN值为未知
boolean_expression IS NOT UNKNOWN为真或者为假

ETWEEN谓词可以简化范围测试:

a BETWEEN x AND y

等效于

a >= x AND a <= y

注意BETWEEN认为终点值是包含在范围内的。 NOT BETWEEN可以做相反比较:

a NOT BETWEEN x AND y

等效于

a < x OR a > y

BETWEEN SYMMETRIC和BETWEEN相似,不过BETWEEN SYMMETRIC不要求AND左边的参数小于或等于右边的参数。如果左参数不是小于等于右参数,这两个参数会自动被交换,这样总是会应用一个非空范围。

当有一个输入为空时,普通的比较操作符会得到空(表示“未知”),而不是真或假。例如,7 = NULL得到空,7 <> NULL也一样。如果这种行为不合适,可以使用IS [ NOT ] DISTINCT FROM谓词:

a IS DISTINCT FROM b
a IS NOT DISTINCT FROM b

对于非空输入,IS DISTINCT FROM和<>操作符一样。不过,如果两个输入都为空,它会返回假。而如果只有一个输入为空,它会返回真。类似地,IS NOT DISTINCT FROM对于非空输入的行为与=相同,但是当两个输入都为空时它返回真,并且当只有一个输入为空时返回假。因此,这些谓词实际上把空值当作一种普通数据值而不是“unknown”。

要检查一个值是否为空,使用下面的谓词:

expression IS NULL
expression IS NOT NULL

或者等效,但并不标准的谓词:

expression ISNULL
expression NOTNULL

不要写expression = NULL,因为NULL是不“等于”NULL的(控制代表一个未知的值,因此我们无法知道两个未知的数值是否相等)。

提示:有些应用可能要求表达式expression = NULL在expression得出空值时返回真。我们强烈建议这样的应用修改成遵循
SQL
标准。但是,如果这样修改不可能完成,那么我们可以使用配置变量transform_null_equals。如果打开它,PostgreSQL将把x
= NULL子句转换成x IS NULL。

如果expression是行值,那么当行表达式本身为非空值或者行的所有域为非空时IS NULL为真。由于这种行为,IS NULL和IS NOT NULL并不总是为行值表达式返回反转的结果,特别是,一个同时包含 NULL 和非空值的域将会对两种测试都返回假。在某些情况下,写成row IS DISTINCT FROM NULL或者row IS NOT DISTINCT FROM NULL会更好,它们只会检查整个行值是否为空而不需要在行的域上做额外的测试。

布尔值也可以使用下列谓词进行测试:

boolean_expression IS TRUE
boolean_expression IS NOT TRUE
boolean_expression IS FALSE
boolean_expression IS NOT FALSE
boolean_expression IS UNKNOWN
boolean_expression IS NOT UNKNOWN

这些谓词将总是返回真或假,从来不返回空值,即使操作数是空也如此。空值输入被当做逻辑值“未知”。 请注意实际上IS UNKNOWN和IS NOT UNKNOWN分别与IS NULL和IS NOT NULL相同, 只是输入表达式必须是布尔类型。

如下表中所示,也有一些比较相关的函数可用。

函数描述例子例子结果
num_nonnulls(VARIADIC “any”)返回非空参数的数量num_nonnulls(1, NULL, 2)2
num_nulls(VARIADIC “any”)返回空参数的数量num_nulls(1, NULL, 2)1

http://www.niftyadmin.cn/n/5329388.html

相关文章

Server/PC 稳定性测试(Windows)

Server/PC 稳定性测试 1. CPU - 中央处理器1.1 CPU稳定性1.2 CPU温度 2. Memory - 内存2.1 内存性能 3. DISK - 硬盘3.1 HDD - 机械硬盘机械硬盘转速详解监测工具 3.2 SSD - 固态硬盘监测工具 4. 使用时长cpu能用多久&#xff1f;主板能用多久&#xff1f;内存能用多久&#xf…

openssl3.2 - 官方demo学习 - signature - rsa_pss_hash.c

文章目录 openssl3.2 - 官方demo学习 - signature - rsa_pss_hash.c概述笔记END openssl3.2 - 官方demo学习 - signature - rsa_pss_hash.c 概述 对私钥对明文做签名(摘要算法为SHA256) 用公钥对密文做验签(摘要算法为SHA256) 笔记 /*! \file rsa_pss_hash.c \note openss…

【昕宝爸爸小模块】深入浅出之JDK21 中的虚拟线程到底是怎么回事(二)

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…

在el-dialog编辑界面el-upload跳动问题

el-dialog中有子组件el-upload&#xff0c;并且做了只能显示一个文件的限制 1.在第一次打开后&#xff0c;关闭dialog&#xff0c;再打开dialog会有跳动 这是因为之前打开的dialog中&#xff0c;文件仍旧在&#xff0c;新一次的打开的文件把上一次顶掉了&#xff0c;所以产生…

第二篇:新建node项目并运行

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 安装 Node.js&#xff1a;首先&#xff0c;确保你的…

[JVM] Java类的加载过程

Java类的加载过程 在Java中&#xff0c;类的加载是指在程序运行时将类的二进制数据加载到内存中&#xff0c;并转化为可以被JVM执行的形式的过程。类的加载过程主要包括以下几个步骤&#xff1a; 加载&#xff08;Loading&#xff09;&#xff1a;通过类的全限定名&#xff0c;…

字符串和整型转换的那些事儿

整形数组如何转换成一个字符串&#xff1f; 总的来说&#xff0c;有两种思路。 思路一 uint8_t str[10] {0};int arr[] {1,2,3,4,5,6};sprintf(str,"%d%d%d%d%d%d",arr[0],arr[1],arr[2],arr[3],arr[4],arr[5]);printf(str); 这种想法非常局限&#xff0c;是直…

Linux第29步_安装“Notepad++”软件

STM32CubeProgrammer脚本文件的后缀为“.tsv”&#xff0c;ST公司官方也叫做FlashLayout。在烧写“TF-A固件”之前&#xff0c;我们需要用“Notepad”软件打开“后缀为.tsv”的脚本文件&#xff0c;根据需求决定哪些文件需要更新&#xff0c;设置好这个脚本文件。 在后期使用S…