【问题标题】:How to exclude rows with varchar2 value that is not null, but exports as null如何排除 varchar2 值不为空但导出为空的行
【发布时间】:2018-11-07 02:55:53
【问题描述】:

我在 varchar2(800) 列中有一些我无法更改的数据,这些数据在 SQL Developer 中显示为 null 并从那里导出为 null,但不是 null

这是我尝试过的:

  • length(mycol)返回3
  • asciistr(mycol) 返回null
  • substr(mycol, 1, 1) 返回null(其他位置返回普通字母)
  • ascii(substr(mycol, 1, 1)) 返回180,这是一个acute accent

我想选择将使用null 值导出的行。

我该怎么做?

我尝试了asciistr(mycol) is not null,但这也会过滤掉带有重音字符且不会导出为null 的文本。我想导出重音字符,但不是在将整列导出为 null 时。

mycol is not nullto_char(mycol) is not null 无效。

显然,我需要一个解决方案,该解决方案适用于字段中任何位置的任何长度的输入和字符怪异。

【问题讨论】:

    标签: null export oracle12c varchar2


    【解决方案1】:

    重音的 ASCII 码是 239。看看这个例子;看看有没有帮助。

    在表格中插入一些值;其中之一是重音

    SQL> create table test (mycol varchar2(10));
    
    Table created.
    
    SQL> insert into test values ('a');
    
    1 row created.
    
    SQL> insert into test values (chr(239));
    
    1 row created.
    
    SQL> select * from test;
    
    MYCOL
    ----------
    a
    ´
    

    里面存储了什么?注意DUMP功能:

    SQL> select mycol, dump(mycol) dmp, ascii(mycol) ascii
      2  from test;
    
    MYCOL      DMP                    ASCII
    ---------- -------------------- -------
    a          Typ=1 Len=1: 97           97
    ´          Typ=1 Len=1: 239         239
    
    SQL> select * from test
      2  where ascii(mycol) <> 239;
    
    MYCOL
    ----------
    a
    
    SQL>
    

    检查DUMP 在您的情况下返回什么;也许列中还有更多 垃圾 但是 - 如果你发现它的真正含义 - 你甚至可以UPDATE 该列并放置一个“真实的”NULL(或其他内容) ) 在那里。

    【讨论】:

    • 没关系,但是 A) 有问题的字符是 180,而不是 239,并且 B) 字符 180 是我迄今为止发现的唯一有问题的字符,而且可能并不总是在位置 1,因此对特定字符或位置的任何引用都不是有用的答案,并且 C)dump() 究竟如何帮助我输出列的文本值?
    • A) 重音(theasciicode.com.ar/extended-ascii-code/…);如果是180,OK,没关系。 B)啊哈;因此,字符串在某处包含 acute 重音;它不是列中的唯一字符。 C) DUMP 无助于输出结果。我希望它可能有助于找到该列中真正存储的内容。哦,对不起,我帮不上忙。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    相关资源
    最近更新 更多