我在对客户数据库Oracle 10g抽取数据时,发现有一个字段从PL/SQL Developer里看明明是空的,肯定不是空格,光标能到Gird的最前面,但是执行
Select * From ODS_PAYREF_FEE F Where F.POLICYNO = '288060208192008000004' And F.ENDORSENO = ''  不能查出来
Select * From ODS_PAYREF_FEE F Where F.POLICYNO = '288060208192008000004' And F.ENDORSENO is NULL 也查不出来
Select * From ODS_PAYREF_FEE F Where F.POLICYNO = '288060208192008000004' And TRIM(F.ENDORSENO) = ''  也查不出来
Select * From ODS_PAYREF_FEE F Where F.POLICYNO = '288060208192008000004' And F.ENDORSENO is NOT NULL 却能查出来,
这是为什么,Developer里看明明是空的,哪位大家遇到这类数据了的,帮忙解释下
附数据库相关配置
NLS_LANGUAGE = AMERICAN
NLS_CHARACTERSET = ZHS16GBK
NLS_RDBMS_VERSION = 10.1.0.2.0
ENDORSENO  字段定义为VARCHAR2(30)
做了一下长度测试
Select  length(F.ENDORSENO) From ODS_PAYREF_FEE F Where F.POLICYNO = '288060208192008000004' 
结果为1

解决方案 »

  1.   

    显然它不是空!估计是一个什么不可见字符。你直接 select ASCII(F.ENDORSENO) 看一下是什么。
      

  2.   

    当您的问题得到解答后请及时结贴.
    http://topic.csdn.net/u/20090501/15/7548d251-aec2-4975-a9bf-ca09a5551ba5.html
      

  3.   

    恩, Select  ASCII(F.ENDORSENO)
    我得出的结果是0,那这样的数据该怎么过滤掉了
      

  4.   

    也有可能是你的工具没法显示。
    在你的sqlplus直接用命令行select 下,看看是什么东东?
      

  5.   

    刚试了,在sqlplus里面也看不到
      

  6.   

    不会就是一个空字符吧?
    Select * From ODS_PAYREF_FEE F Where F.POLICYNO = '288060208192008000004' And F.ENDORSENO = ' '
    注意条件后面两个单引号之间有个空格啊
      

  7.   

    TRIM(F.ENDORSENO) = ''  也查不出来 
    为什么?因为oracle的查询语句 ='' 不加空格的相当于使用 is null,明显你这里不是null。
    把条件 TRIM(F.ENDORSENO) = '' 
    改为
    length(TRIM(F.ENDORSENO)) is null
    如果能查出来,表示它就是个空字符串。 
      

  8.   

    就是一个空格[SYS@ora10gr1#19-12月-09] SQL>select '|'||chr(0)||'|' from dual;'|'
    ---
    | |select xxx from 表名 where trim(字段)='';
    --相当于
    select xxx from 表名 where trim(字段)=NULL;
    --这样查询自然就查不出结果了。
      

  9.   

    就是一个空格[SYS@ora10gr1#19-12月-09] SQL>select '|'||chr(0)||'|' from dual;'|'
    ---
    | |select xxx from 表名 where trim(字段)='';
    --相当于
    select xxx from 表名 where trim(字段)=NULL;
    --这样查询自然就查不出结果了。
      

  10.   

    就是一个空格[SYS@ora10gr1#19-12月-09] SQL>select '|'||chr(0)||'|' from dual;'|'
    ---
    | |select xxx from 表名 where trim(字段)='';
    --相当于
    select xxx from 表名 where trim(字段)=NULL;
    --这样查询自然就查不出结果了。
      

  11.   

    判断用 length(trim(a,a)) = 0 是否可以呢?
      

  12.   

    还有一种方法,用PLSQL将你查询到的那行生成一个insert语句,删除原来的记录,然后修改里面你认为是空格或不可见字符的内容,再插回去。
      

  13.   

    看下ascii对照表中的对应关系0 NUT 32 (space) 64 @ 96 、所以那个你看不到的值是空格,
    限制下条件 F.ENDORSENO = ' '
    单引号中是有个空格的
      

  14.   

    int类型的用大于小于判断 <0
    VarChar类型 <'' or !=''