Обрезка пробелов в столбце Char в DB2

Я пытаюсь удалить пробелы, которые появляются в столбце CHAR в DB2. Я получил некоторую помощь здесь с функцией 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) но это не работает Можно ли обрезать эти пробелы?

Пример записи

Спасибо,

2 ответа

Решение

Используйте LTRIM() или TRIM (), чтобы обрезать пробелы перед левым ()

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

В последних версиях db2 вы также можете использовать только trim() для удаления пробелов с обеих сторон.

Другие вопросы по тегам