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);
或者删除使用相同过滤器的行,如果它们根本不应该被加载。
产品版本: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:
来将值视为 nullselect * 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);
或者删除使用相同过滤器的行,如果它们根本不应该被加载。