2015-02-24 103 views
0

我试图删除DB2中出现在CHAR列中的空格。我收到一些帮助这里的功能TRANSLATE,以确定是否Left信息包含在三个字母开始记录:修剪DB2中Char列中的空白空间

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),但那不行。是否可以修剪这些空白空间?

Record Example

谢谢,

回答

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' 
)); 
+0

谢谢,不知道为什么,但我曾尝试RTRIM第一...呃。但再次感谢! – MISNole 2015-02-24 14:40:14

1

在最近版本的DB2,你也可以只使用TRIM()清除双方的空白。

+0

谢谢,我会检查出来的。 – MISNole 2015-02-24 15:00:21

+0

请注意,如果您只需要从左侧删除空格,则使用LTRIM(),因为这会比TRIM()少开销。这同样适用于右侧的空白;你想使用RTRIM()而不是TRIM()。只有使用TRIM(),如果你真的需要删除双方的空白。 – Charles 2015-02-24 15:35:32