Обрезка пробелов в столбце 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() для удаления пробелов с обеих сторон.