ORACLE中字符串比较
在ORACLE中,将空字符串视为NULL,任何值与NULL比较结果都为NULL。如此一来,在比较两个字符串的时候就会出现意外。请看以下的例子:
DECLARE
i VARCHAR2(10) := NULL;
v VARCHAR2(10) := 'ABC';
BEGIN
IF(i = v) THEN
DBMS_OUTPUT.PUT_LINE('相等');
ELSE
DBMS_OUTPUT.PUT_LINE('不等');
END IF;
END;
请你用你聪明的头脑判断一下,结果应该是什么?很容易就可以得出结果:'不等'。很好,你是对的。在SQLPLUS上运行的结果和你想的一样。那么我改一下程序,你再判断一下:
DECLARE
i VARCHAR2(10) := NULL;
v VARCHAR2(10) := 'ABC';
BEGIN
IF(i <> v) THEN
DBMS_OUTPUT.PUT_LINE('不等');
ELSE
DBMS_OUTPUT.PUT_LINE('相等');
END IF;
END;
看上去和第一个程序没有太大的差别,很容易就得出结果:'不等'。呵呵。你确定结果就是这个吗?那么请你在SQLPLUS测试一下,来验证你是正确的。很可惜,正确的结果应该是:'相等'。是不是很诧异?正如开始所说的:任何值与NULL比较结果都为NULL。即在第一个程序中的i=v比较的结果应该是NULL,而第二个程序中的i<>v比较的结果也是NULL。当IF结构中的条件为NULL时,将跳过当前的分支进入到ELSE或者是结束。不行吗?那你运行一下以下的程序将可以等到验证:
BEGIN
IF(NULL) THEN
DBMS_OUTPUT.PUT_LINE('NOT NULL');
ELSE
DBMS_OUTPUT.PUT_LINE('NULL');
END IF;
END;
结果输出的是:'NULL'。
那么应该怎样正确的比较两个字符串呢?
首先我先说说如何确定两个字符串相等(还是用上边的两个变量i和v)。
1、当i和v都为NULL的时候,认为i和v相等。i IS NULL AND v IS NULL(不要写成这样:i = v。从上边的分析我们可以知道这样写的结果为NULL)。
2、当i和v中只有一个为NULL,肯定不相等。
3、当i和v都不为NULL的时候,我们就可以用‘=’号来判断它们是否相等。i IS NOT NULL AND v IS NOT NULL AND i = v。
根据以上三点,我们可以得出判断i和v相等的条件表达式:i IS NULL AND v IS NULL OR i IS NOT NULL AND v IS NOT NULL AND i = v。
那么两个字符串不相等的条件表达式只需要判断相等的表达式为FALSE就可以了。
把判断两个字符串是否相等的功能写成函数:
create or replace function isequal(var1 in varchar2, var2 in varchar2)
return number -- 0:不等 1:相等 -1:错误
is
DECLARE
i VARCHAR2(10) := NULL;
v VARCHAR2(10) := 'ABC';
BEGIN
IF(i = v) THEN
DBMS_OUTPUT.PUT_LINE('相等');
ELSE
DBMS_OUTPUT.PUT_LINE('不等');
END IF;
END;
请你用你聪明的头脑判断一下,结果应该是什么?很容易就可以得出结果:'不等'。很好,你是对的。在SQLPLUS上运行的结果和你想的一样。那么我改一下程序,你再判断一下:
DECLARE
i VARCHAR2(10) := NULL;
v VARCHAR2(10) := 'ABC';
BEGIN
IF(i <> v) THEN
DBMS_OUTPUT.PUT_LINE('不等');
ELSE
DBMS_OUTPUT.PUT_LINE('相等');
END IF;
END;
看上去和第一个程序没有太大的差别,很容易就得出结果:'不等'。呵呵。你确定结果就是这个吗?那么请你在SQLPLUS测试一下,来验证你是正确的。很可惜,正确的结果应该是:'相等'。是不是很诧异?正如开始所说的:任何值与NULL比较结果都为NULL。即在第一个程序中的i=v比较的结果应该是NULL,而第二个程序中的i<>v比较的结果也是NULL。当IF结构中的条件为NULL时,将跳过当前的分支进入到ELSE或者是结束。不行吗?那你运行一下以下的程序将可以等到验证:
BEGIN
IF(NULL) THEN
DBMS_OUTPUT.PUT_LINE('NOT NULL');
ELSE
DBMS_OUTPUT.PUT_LINE('NULL');
END IF;
END;
结果输出的是:'NULL'。
那么应该怎样正确的比较两个字符串呢?
首先我先说说如何确定两个字符串相等(还是用上边的两个变量i和v)。
1、当i和v都为NULL的时候,认为i和v相等。i IS NULL AND v IS NULL(不要写成这样:i = v。从上边的分析我们可以知道这样写的结果为NULL)。
2、当i和v中只有一个为NULL,肯定不相等。
3、当i和v都不为NULL的时候,我们就可以用‘=’号来判断它们是否相等。i IS NOT NULL AND v IS NOT NULL AND i = v。
根据以上三点,我们可以得出判断i和v相等的条件表达式:i IS NULL AND v IS NULL OR i IS NOT NULL AND v IS NOT NULL AND i = v。
那么两个字符串不相等的条件表达式只需要判断相等的表达式为FALSE就可以了。
把判断两个字符串是否相等的功能写成函数:
create or replace function isequal(var1 in varchar2, var2 in varchar2)
return number -- 0:不等 1:相等 -1:错误
is
begin
if (var1 is null and var2 is null or
var1 is not null and var2 is not null and var1 = var2) then
return 1;
else
return 0;
end if;
if (var1 is null and var2 is null or
var1 is not null and var2 is not null and var1 = var2) then
return 1;
else
return 0;
end if;
exception
when others then
return - 1;
end;
when others then
return - 1;
end;
相关推荐
在Oracle数据库中,将字符串转换为数字是一项常见的操作,特别是在处理包含数字的字符串列时,可能需要进行数值计算或按照数值大小进行排序。本篇文章将深入探讨如何在SQL查询中利用Oracle提供的函数来实现这一目标...
在Oracle数据库中,有时我们需要将多个字段值转换为单个字符串,或者将多行记录合并成一行,这在数据处理和报告生成时尤其常见。Oracle提供了多种方法来实现这一目标,包括使用内置函数、PL/SQL过程以及一些高级特性...
这个错误通常意味着在处理字符串数据时,Oracle无法找到预期的NULL终止符,这可能是由于多种原因引起的。以下是对这个问题的详细分析和解决策略: 首先,我们要理解“STR 绑定值的结尾 Null 字符缺失”错误的可能...
在Oracle数据库中,字符串处理是日常数据库操作的重要组成部分。这里我们详细探讨了多个与字符串相关的函数,它们在处理和操作文本数据时非常有用。 1. **SUBSTR** 函数:这个函数用于从字符串中提取子串。基本语法...
Sybase 中同样不存在长度为 0 的字符串,但是与 Oracle 不同的是,Sybase 并不将空串视作 NULL,而是视作与只包含一个空格的字符串等价。 Oracle 中 null 的长度是一些文章上说 null 长度为零(×),其实长度也为...
- `LOWER(char)`: 该函数用于将输入的字符串`char`中的所有大写字母转换为小写字母,常用于不区分大小写的查询或比较。 - `UPPER(char)`: 与`LOWER`相反,它将字符串中的所有小写字母转换为大写字母。 - `INITCAP...
以上内容详细介绍了Oracle SQL中的SELECT语句及其相关操作,包括基本语法、数学表达式、NULL处理、别名设置、字符串拼接、条件限制以及排序等方面的知识点。这些知识点是学习和掌握Oracle SQL的重要基础,能够帮助...
Oracle数据库在处理多行记录合并、连接和聚合字符串时,有多种方法,下面将详细介绍其中的几种常见技术。 1. 被集合字段范围小且固定型 这种方法适用于字段值有限且已知的情况。通过使用`DECODE`函数,我们可以为每...
和其他数据库系统类似,Oracle字符串连接使用“||”进行字符串拼接,其使用方式和MSSQLServer中的加号“+”一样。 比如执行下面的SQL语句: 代码如下:SELECT ‘工号为’||FNumber||’的员工姓名为’||FName FROM T_...
### ORACLE常用数值函数、转换函数、字符串函数详细介绍 #### 数值函数 1. **ABS(M)** - **功能**: 返回数值M的绝对值。 - **示例**: 如果输入`-123`, 函数返回`123`。 2. **MOD(M, N)** - **功能**: 返回M...
Oracle 中分组后拼接分组字符串 在 Oracle 中,分组后拼接分组字符串是一种常见的操作,用于将分组后的多条记录的某字段进行拼接。下面我们来详细介绍如何实现这种操作。 首先,创建一个测试表 `test`,该表包含三...
因此,我们不能像字符串和数字那样进行比较,而是需要使用 `isNull` 和 `is not null` 来判断值是否为空或 Null。 在 Oracle 和 SQL Server 中,我们可以使用 `NVL` 和 `ISNULL` 函数来判断值为空或 Null,並使用 `...
### Oracle中的日期和字符串互相转换 在Oracle数据库中,日期和字符串之间的转换是十分常见的操作。这类转换在处理数据时非常有用,可以帮助我们更高效地管理和查询数据。本文将详细介绍Oracle中日期与字符串互相...
- **功能**: 返回一个新的字符串,在原字符串`string1`右侧添加`string2`中的字符,直到达到指定的长度`x`。如果没有指定`string2`,则使用空格填充。 - **使用位置**: 过程性语句和SQL语句。 **1.1.10 RTRIM** - ...
- 上述SQL函数提供了丰富的字符串处理、日期处理以及数学运算功能,极大地方便了数据处理和分析工作。 ### 6. 事务管理 - **`commit;`**:提交当前事务,使所有更改永久保存。 - **`rollback;`**:回滚当前事务,...
2. 数据类型:Oracle支持多种数据类型,如VARCHAR2(可变长度字符串)、NUMBER(数值)、DATE(日期时间)、LONG(长文本)、BLOB(二进制大对象)等,用于存储不同类型的数据。 3. 表的创建:使用CREATE TABLE语句...
这是因为 Java 在处理字符串时默认按照特定的字符集进行解码,而在本例中,Java 应用期望使用 `ZHS16GBK` 解码,但实际上却按照 `US7ASCII` 编码的数据进行了解码,从而导致乱码现象的发生。 #### 解决方案 为了...
- 连接号(Concatenation):使用`||`将字符串拼接。 - DISTINCT关键字:去除重复的行。 - ORDER BY:根据指定字段排序,DESC为降序,ASC为升序。 - NULL处理:WHERE子句中可使用IS (NOT) NULL判断字段是否为空...
- `COLUMN name format a15`: 设置字符串显示宽度为15个字符。 - `COLUMN salary justify left`: 输出格式设置为左对齐。 - `COLUMN salary heading "SALARY" AS`: 设置显示的字段名为"SALARY"。 - **清除列格式...