产品版本:Oracle 19C
我有一个带有列定义myTable的分区表myCol VARCHAR2(2 BYTE)。
最近,使用some加载了一些数据,在加载过程中,显然在没有值的情况下,空间被加载到该列中。我试图将带有空格/空白的行视为null。
我的问题:如何找到空行中包含的内容,以及如何在选择这些行时将这些值视为null?
当我发出下面的查询时,我看到没有返回任何行。
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行
发布于 2021-08-14 15:39:09
这些字符不是空格或空格,列本身不是空的;它有两个空字符。(见ASCII或Unicode.)这就是转储和ascii调用所显示的-字符代码为零。
因此,与其查找空号或空格,还可以查找这一对字符:
select * from myTable where myCol = chr(0) || chr(0);或通过修剪该字符而不是默认空格将该值视为null:
select * from myTable where trim(both chr(0) from myCol) is null;或者用那个字符来修剪/修剪。
db<>fiddle演示;但是显示一个ID而不是实际值,因为空字符会在那里中断输出。(它们也会混淆其他客户端;例如,您无法正确地从复制。)
假设您认为数据加载是不正确的,且该列是可空的,则您可能需要使用以下方法更正已加载的数据:
update myTable set myCol = null where myCol = chr(0) || chr(0);或者使用相同的筛选器删除行,如果它们根本不应该加载的话。
https://stackoverflow.com/questions/68784546
复制相似问题