日期:2014-05-17  浏览次数:20431 次

.NET查询条件中的空与Oracle数据库中的空有何不同??
如在.NET的程序中写这样的查询语句:
string filter = "";
string sql = "select * from t_table where name='" + filter + "'";

咋看之下这个查询执行应该是没有什么问题的,但是结果却是没有任何数据能被查询出来;就算改成如下语句也没用:
string sql = "select * from t_table where nvl(name,'' ='" + filter + "'";

下午花了很久才发现这里面的问题:这个主要是因为Oracle里面把''(空字符,中间没有空格)作为NULL来处理,如果将上面的语句改成下面这样就能查出name字段为空的数据行:
select * from t_table where trim(name) is null  
或 select * from t_table where nvl(name,'') is null  

这样的话就存在一个比较大的问题了,因为在程序当中我们一般都会用trim()方法来去掉左右的空格,而如果我们在查询的条件之中恰好是空格时,那不是查出不数据了吗??这不是存在问题了吗?请问一下碰到这种情况应该办呢???

------解决方案--------------------
用 name is null or name=' ';
空格的话,两个分号不要紧挨着,分开点就可以了。
------解决方案--------------------
空字符串("")和空引用(null)及空字段(DBNull)是完全不同的三个概念...多看看书...
------解决方案--------------------
Oracle里面 '' 和 null 是一样的

nvl(name, '') 这一句一点用也没有。。。

一般的做法是在程序端判断如果为空,条件就不拼了。

或者在条件里加上:

where :name is null 
or name = :name

如果 :name 传进来的是 null 那么条件永远为真。
------解决方案--------------------
探讨
用 name is null or name=' ';
空格的话,两个分号不要紧挨着,分开点就可以了。

这个也不能保证是几个空格职~~~~

------解决方案--------------------
取为空的资料:
select * from tb where col is null
或者
select * from tb where nvl(col,'')=''

取不为空的资料:
select * from tb where col is not null


------解决方案--------------------
SQL code

SQL> select * from test where regexp_like(field1,'\s+') or field1 is null;