oracle 的 null 和 空字符串('')

本文介绍在Oracle数据库中如何通过使用isnull函数来查询字段为空或为null的记录,包括实例演示和注意事项。

在oracle中 如何查询 字段为空的记录呢?

背景 :

表 testNull (

id int not null primary key ,

name varchar2(20) null

)


insert into testNull values(1,'a');

insert into testNull values(2,'b');

insert into testNull values(3,'');

insert into testNull values(4,'');


如果要查询 name 为 ‘’ 或者 null 的记录,则要通过 is null 来完成

select * from testNull where name is null; 如果写成 where name ='' 或者 where name = null 则无法查询出来。



from:http://edgenhuang.iteye.com/blog/975567







-- oracle 将 空字符串即''当成null,测试脚本如下:

 

select nvl(null,-1) from dual;
select nvl('','-1') from dual;
select nvl(nvl(null,''),-1) from dual;

select nvl(trim('  '),'-1') from dual;

 

-- 但是要记住,null 与任何值做逻辑运算得结果都为 false,包括和null本身:

 

select nvl(max('1'),-1) from dual where null = '';
select nvl(max('1'),-1) from dual where null <> '';
select nvl(max('1'),-1) from dual where null = '-1';
select nvl(max('1'),-1) from dual where null <> '-1';

select nvl(max('1'),-1) from dual where null = null;
select nvl(max('1'),-1) from dual where null <> null;

 

-- 不过,用 is null 判断时,空字符串和 null 都 is null:

 

select nvl(max('1'),-1) from dual where '' is null;
select nvl(max('1'),-1) from dual where null is null;

 

--------------------------------------------------------------------------------------------------

 

-- 还要记住,null 和任何数值进行数学运算,结果都为 null:

 

select nvl(null + 0,-1) from dual;

 

-- 不过,可以使用 || 将空字符串或 null 和字符串连接

 

select 'a' || null || 'b' from dual; 

 

--------------------------------------------------------------------------------------------------

 

-- 另,作为以下的 Oracle 内置的函数的参数时,结果也为 null:
select nvl(length(null),-1) from dual;

select nvl(trim(null),-1) from dual;

select nvl(ltrim(null),'-1') from dual;
select nvl(rtrim(null),'-1') from dual;
select nvl(rtrim(null,' '),'-1') from dual;

select nvl(soundex(null),'-1') from dual;

select nvl(SubStr(null,1),-1) from dual;

select nvl(InStr(null,1),-1) from dual;

select nvl(replace(null,'a','b'),'-1') from dual;

 

select nvl(min(null),'-1') from dual;
select nvl(max(null),'-1') from dual;
select nvl(sum(null),'-1') from dual;
select nvl(avg(null),'-1') from dual;
select nvl(sum(null),'-1') from dual;

 

 

-- 不过,作为以下的 Oracle 内置的函数的参数时,结果不为null:

select concat('a', null) from dual;
select concat(null, 'a') from dual;


select count(null) from dual;

 

-- 其他函数用的时候,也可以使用以上的方法测试

Oracle 数据库中,`NULL` 值与字符串 `''` 是等价的,这意味着在查询或插入数据时,字符串会被自动转换为 `NULL`[^4]。因此,直接使用 `NVL()` 函数将 `NULL` 替换为字符串,例如 `NVL(列名, '')`,并不能达到预期效果,结果仍然为 `NULL`[^1]。 要将查询结果中的 `NULL` 值显示字符串,可以使用 `NVL()` 函数结合 `TO_CHAR()` 函数来实现。例如: ```sql SELECT NVL(TO_CHAR(列名), '') AS 列别名 FROM 表名; ``` 这里,`TO_CHAR()` 函数用于确保列值为字符串类型,然后 `NVL()` 函数将其转换为字符串。 另外,如果希望在应用程序层面处理这个问题,可以在获取数据后使用编程语言(如 Java、Python 等)将 `NULL` 值转换为字符串。例如,在 Python 中使用 cx_Oracle 连接 Oracle 数据库时,可以通过以下方式实现: ```python import cx_Oracle connection = cx_Oracle.connect('username/password@hostname:port/service_name') cursor = connection.cursor() cursor.execute('SELECT 列名 FROM 表名') rows = cursor.fetchall() for row in rows: # 将 NULL 转换为字符串 value = row[0] if row[0] is not None else '' print(value) cursor.close() connection.close() ``` 在上述代码中,`row[0]` 表示从数据库查询得到的某一列值,如果该值为 `None`(即数据库中的 `NULL`),则将其转换为字符串 `''`[^1]。 此外,如果需要在插入数据时避免 `NULL` 值,可以在插入语句中使用 `NVL()` 函数确保字符串不会被转换为 `NULL`: ```sql INSERT INTO 表名 (列名) VALUES (NVL(:value, '')); ``` 这里的 `:value` 是一个绑定变量,表示要插入的实际值。如果 `:value` 为 `NULL`,则插入字符串 `''`。 ### 查询时处理 NULL 值 在执行查询操作时,若希望将 `NULL` 值显示字符串,可以使用 `COALESCE()` 函数代替 `NVL()` 函数,因为 `COALESCE()` 是 SQL 标准函数,支持多个参数,且功能与 `NVL()` 类似: ```sql SELECT COALESCE(列名, '') AS 列别名 FROM 表名; ``` 尽管如此,需要注意的是,由于 Oracle字符串视为 `NULL`,因此即使使用 `COALESCE()` 或 `NVL()`,最终结果仍可能显示为 `NULL`。为了确保结果始终显示字符串,建议在应用程序层面进行处理。 ### 总结 综上所述,在 Oracle 数据库中将 `NULL` 值替换为字符串是一个具有挑战性的任务,因为 Oracle 本身将字符串视为 `NULL`。可以通过以下几种方法实现目标: 1. **使用 `NVL()` 或 `COALESCE()` 函数**:在查询语句中使用这些函数将 `NULL` 值替换为字符串。 2. **结合 `TO_CHAR()` 函数**:确保列值为字符串类型后再进行替换。 3. **应用程序层面处理**:在获取数据后使用编程语言将 `NULL` 值转换为字符串。 4. **插入数据时处理**:在插入语句中使用 `NVL()` 函数确保字符串不会被转换为 `NULL`。 通过以上方法,可以根据具体需求选择最合适的方式来处理 Oracle 数据库中的 `NULL` 值与字符串之间的转换问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值