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> |
+--------+--------+