Intereting Posts

DB2 / iSeries SQL очищает CR / LF, вкладки и т. Д.

Мне нужно найти и очистить разрывы строк, возврат каретки, вкладки и символы «SUB» в наборе строковых записей 400k +, но эта среда DB2 сказывается на мне.

Думал, что я мог бы выполнить поиск и замену с помощью функций REPLACE () и CHR (), но, похоже, CHR () недоступен в этой системе (ошибка: CHR в * тип LIBL * N не найден). Работа с \ t, \ r, \ n и т. Д., Похоже, не работает. Черты могут быть в середине строк или в конце их.

DBMS = DB2 System = iSeries Language = SQL Encoding = Not sure, possibly EBCDIC 

Любые намеки на то, что я могу с этим сделать?

Если вы хотите очистить определенные символы, такие как возврат каретки (EBCDIC x'0d) и линейный канал (EBCDIC x'25 '), вы должны найти переведенный символ в EBCDIC, затем используйте функцию TRANSLATE (), чтобы заменить их пробелом.

Если вы просто хотите удалить недопустимые символы, тогда найдите что-нибудь под x'40 '.

Я использовал этот SQL для поиска x'25 'и x'0D':

 SELECT <field> , LOCATE(x'0D', <field>) AS "0D" , LOCATE(x'25', <field>) AS "25" , length(trim(<field>)) AS "Length" FROM <file> WHERE LOCATE(x'25', <field>) > 0 OR LOCATE(x'0D', <field>) > 0 

И я использовал этот SQL для их замены:

 UPDATE <file> SET <field> = REPLACE(REPLACE(<field>, x'0D', ' '), x'25', ' ') WHERE LOCATE(x'25', <field>) > 0 OR LOCATE(x'0D', <field>) > 0 

Попробуйте перевести или ЗАМЕНИТЬ.

Метод грубой силы включает использование POSITION для поиска ошибочного символа, затем SUBSTR до и после него. CONCAT – две подстроки (за исключением нежелательного характера), чтобы переформатировать столбец.

Кодировка символов почти наверняка является одним из наборов символов EBCDIC. В зависимости от того, как загружена таблица в первую очередь, CR может быть x'0d 'и LF x'15', x'25 '. Легкий способ узнать – добраться до зеленого экрана и сделать DSPPFM против стола. Нажмите F10, затем F11, чтобы просмотреть таблицу, это формат raw, шестнадцатеричный (над / под).

Подробнее о доступных функциях см. В Справочнике SQL для i5 / OS SQL .

Возможно, функция TRANSLATE() будет отвечать вашим потребностям.

  TRANSLATE( data, tochars, fromchars ) 

… где fromchars – это набор символов, которые вам не нужны, а tochars – соответствующие символы, которые вы хотите заменить. Возможно, вам придется записать это в шестнадцатеричном формате, как x'nnnnnn...' и вам нужно будет знать, с каким персонажем вы работаете. Использование команды DSPFFD в вашей таблице должно показывать CCSID ваших полей.

Вот пример скрипта, который заменяет X'41' на X'40' . Что-то, что создавало проблемы в нашем магазине:

 UPDATE [yourfile] SET [yourfield] = TRANSLATE([yourfield], X'40', X'41') WHERE [yourfield] like '%' concat X'41' concat '%' 

Если вам нужно заменить более одного символа, добавьте шестнадцатеричные строки «to» и «from» в значения, которые вам нужны в функции TRANSLATE .