我试图删除DB2中CHAR列中出现的空格。我在函数TRANSLATE
中收到了一些帮助,以确定Left
是否包含以三个字母开头的记录:
select pat.f1, hos.hpid, hos.hpcd
from patall3 pat
join hospidl1 hos on pat.f1=hos.hpacct
where TRANSLATE(
LEFT( hos.hpid, 3 ),
'AAAAAAAAAAAAAAAAAAAAAAAAA',
'BCDEFGHIJKLMNOPQRSTUVWXYZ'
) <> 'AAA'
order by pat.f1;
但正如您在我的屏幕截图中看到的那样,有些记录仍然存在,大概是因为它们以空格开头。我试过cast (hos.hpid as varchar)
,但这不起作用。是否可以修剪这些空格?
谢谢,
答案 0 :(得分:1)
在最新版本的db2中,您还可以使用trim()从两边删除空白。
答案 1 :(得分:0)
使用LTRIM()或TRIM()在LEFT()
之前修剪空白select pat.f1, hos.hpid, hos.hpcd
from patall3 pat
join hospidl1 hos on pat.f1=hos.hpacct
where TRANSLATE(
LEFT( LTRIM(hos.hpid), 3 ),
'AAAAAAAAAAAAAAAAAAAAAAAAA',
'BCDEFGHIJKLMNOPQRSTUVWXYZ'
) <> 'AAA'
order by pat.f1;
请注意,在WHERE子句中使用此类函数意味着性能将受到影响。至少,查询引擎必须进行完整的索引扫描;它可以进行全表扫描。
如果这是一次性或小桌子,那不是什么大不了的事。但是,如果您需要经常在一个大表上执行此操作,请查看您的平台和DB2版本是否支持索引中的表达式...
create index myindex on hospidl1
( TRANSLATE(
LEFT( TRIM(hpid), 3 ),
'AAAAAAAAAAAAAAAAAAAAAAAAA',
'BCDEFGHIJKLMNOPQRSTUVWXYZ'
) );