COMPARE
📄字数 1.0K
👁️阅读量 加载中...
功能描述
大对象比较。
先比较长度,如果长度不相等,返回 1;
如果长度相等,继续比较值,返回值为第一个不相等字节的差值(无符号字符相减,转换为有符号整数),如果第一个参数等于第二个参数,则返回 0。
语法格式
sql
COMPARE(expr1, expr2)输入参数
expr1:BLOB或CLOB类型,或能隐式转换为BLOB或CLOB类型的其他类型。expr2:BLOB或CLOB类型,或能隐式转换为BLOB或CLOB类型的其他类型。
提示
- 因
NULL无具体的类型,参数均为NULL时,会产生异常E10100 候选函数出现多义性,需要手动为参数指定具体的类型,如:COMPARE(NULL::BLOB, NULL)。
输出结果
返回 INTEGER 类型,任意输入参数为 NULL 时,输出结果为 NULL。
输出结果规则如下:
- 若
expr1和expr2的长度不相等,返回1。 - 若
expr1小于expr2:返回负数。 - 若
expr1等于expr2:返回0。 - 若
expr1大于expr2:返回正数。
注意
- 该函数在
Windows环境下固定返回-1(小于)、0(等于)或1(大于)三个值。在Linux环境下返回第一个不相等字节的差值,返回值包括:负数(小于)0(等于)正数(大于),实际返回结果和函数内部实现相关,这里不做讨论。应该关注返回结果是正数、负数、0或者1。 - 例如:
Windows环境下,COMPARE('10', '15'),返回结果为-1,表示10小于15;Linux环境下,COMPARE('10', '15'),返回结果为-1280(0x3031 - 0x3531),也表示10小于15;
示例
以 Liunx 平台为例:
sql
-- 比较字符串
SQL> SELECT COMPARE('1.9', '2.1');
+-------+
| EXPR1 |
+-------+
| -1 |
+-------+
-- 比较的长度不相等
SQL> SELECT COMPARE('19', '211');
+-------+
| EXPR1 |
+-------+
| 1 |
+-------+
SQL> CREATE TABLE tab_test_lob(col1 BLOB, col2 CLOB);
SQL> INSERT INTO tab_test_lob VALUES ('a123b456c741d852c963f', '1测试qaz@#¥^&*');
SQL> INSERT INTO tab_test_lob VALUES ('789a456b123cc963f741d', '2测试qaz@#¥^&*');
-- 比较BLOB类型
SQL> SELECT COMPARE(col1, '789a456b123cc963f741d'::BLOB) FROM tab_test_lob;
+-------+
| EXPR1 |
+-------+
| 3 |
| 0 |
+-------+
-- 比较CLOB类型
SQL> SELECT * FROM tab_test_lob WHERE COMPARE(col2, '测试qaz@#¥') = 1;
+--------+--------+
| COL1 | COL2 |
+--------+--------+
| <BLOB> | <CLOB> |
| <BLOB> | <CLOB> |
+--------+--------+