Oracle varchar2 字段空白与 null

Oracle varchar2 field blanks vs null

产品版本Oracle 19C

我有一个分区 table myTable,列定义 myCol VARCHAR2(2 BYTE)

最近使用 SQL Loader 加载了一些数据,并且在加载过程中显然没有值时已将空格加载到此列。 我正在尝试将 spaces/blanks 的行视为 null。

我的问题: 当我 select 这些行时,如何找到包含在空白行中的内容以及如何将这些值视为空值?

当我发出以下查询时,我没有看到返回的行。

select * from myTable where trim(myCol) is null

我无法弄清楚这些行中包含的内容。请参阅下面我尝试过的调试查询 -

select '#'||myCol||'#' from myTable ;

产出

--##

select length(myCol) from myTable ;

产出

--2

select ascii(substr(myCol, 1,1)) as myCol_ascii_Post1 from myTable ;

产出

--0

select ascii(substr(myCol, 2,1)) as myCol_ascii_Post2 from myTable ;

--0

select ascii(substr(myCol, 3,1)) as myCol_ascii_Post3 from myTable ;

产出

--(空)

select DUMP(myCol) from myTable ;

产出

--Typ=1 Len=2: 0,0

select myCol,trim(myCol) as myCol_trim,nvl(trim(myCol),'NULL Value') as myCol_trim_nvl from myTable ;

输出 -- 空白,空白,空白

select count(myCol)
from myTable and trim(myCol) is null;

产出

--0

select count(myCol) from myTable and trim(myCol) = '';

产出

--0

select myCol from myTable; 

产出

-- 几个空白行

select count(myCol) from myTable and ascii(myCol) = 0 order by 1 desc;

产出

--345051行

select count(myCol) from myTable and ascii(myCol) > 0 order by 1 desc;

产出

-- 0 行

字符不是space或空格,列本身不为空;它有两个空字符。 (参见 ASCII or Unicode。)这就是转储和 ascii 调用显示的内容 - 字符代码零。

因此,与其寻找 null 或 spaces,不如寻找那对字符:

select * from myTable where myCol = chr(0) || chr(0);

或者通过修剪该字符而不是默认值 space:

来将值视为 null
select * from myTable where trim(both chr(0) from myCol) is null;

或 ltrim/rtrim 与该字符。

db<>fiddle 演示;但显示 ID 而不是实际值,因为空字符会破坏那里的输出。 (它们也会让其他客户感到困惑;例如,您无法正确地从 SQL Developer 复制。)

假设您认为数据加载不正确,并且该列可以为空,您可能想要更正加载的数据:

update myTable set myCol = null where myCol = chr(0) || chr(0);

或者删除使用相同过滤器的行,如果它们根本不应该被加载。