如在.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()方法来去掉左右的空格,而如果我们在查询的条件之中恰好是空格时,那不是查出不数据了吗??这不是存在问题了吗?请问一下碰到这种情况应该办呢???

解决方案 »

  1.   

    这里我补充一下,一般我们在程序当中保存数据时也会将左右空间去掉,在存入了Oracle数据库当中时,却被当作为了NULL,导致要查为空的数据时却查不出来,我总感觉这有挺头痛的在SQL SERVER中却不存在这样的问题。。急求解啊,以上为个人见解,望高人指点
      

  2.   

    --试试这样看看
    select * from t_table 
    where (case when tirm(filter)is null then 1 end)=1 
          or name=filter 
      

  3.   

    引用 1 楼 rfx007 的回复:
    这里我补充一下,一般我们在程序当中保存数据时也会将左右空间去掉,在存入了Oracle数据库当中时,却被当作为了NULL,导致要查为空的数据时却查不出来,我总感觉这有挺头痛的在SQL SERVER中却不存在这样的问题。。急求解啊,以上为个人见解,望高人指点SQL code--试试这样看看
    select * from t_table 
    where (case when tirm(filter)is null then 1 end)=1 
          or name=filter 为什么我点引用没反应??如果这样的话,那本意是想查name为空的数据行就会变成查出所有的数据行了~~~~
      

  4.   

    select * from t_table  
    where name is null or name=filter  
      

  5.   

    nvl(replace(trim(name),' ',''),1)=1