Как удалить все нечисловые буквы в db2 - PullRequest
4 голосов
/ 27 февраля 2009

У меня есть некоторые данные в столбце DATA (varchar), которые выглядят так:

Nowshak 7,485 m
Maja e Korabit (Golem Korab) 2,764 m
Tahat 3,003 m
Morro de Moco 2,620 m
Cerro Aconcagua 6,960 m (located in the northwestern corner of the province of Mendoza)
Mount Kosciuszko 2,229 m
Grossglockner 3,798 m

Что я хочу это:

7485
2764
3003
2620
6960
2229
3798

В IBM DB2 версии 9.5 есть способ удалить / удалить все эти нечисловые буквы, выполнив что-то вроде этого: SELECT replace(DATA, --somekind of regular expression--, '') FROM TABLE_A или каким-либо другим способом?

Этот вопрос следует из этого вопроса .

Ответы [ 7 ]

5 голосов
/ 28 февраля 2009

Как предлагается в другом вопросе, функция TRANSLATE может помочь. Например, попробуйте это:

select translate('Nowshak 7,485 m','','Nowshakm,') from sysibm.sysdummy1;

Возвращает:

7 485

Вероятно, с небольшой настройкой вы можете получить это так, как вы хотите ... в третьем аргументе функции вам просто нужно указать весь алфавит. Это некрасиво, но это сработает.

3 голосов
/ 07 июня 2016

Поскольку многие из ответов, приведенных выше, лучше всего использовать функцию ПЕРЕВОД. Однако этот подход отличается от другого, поскольку вы можете белый список символов, которые вы хотите, вместо черного списка символов, которые вы не хотите. Мы можем сделать это, используя функцию перевода дважды. Мы будем использовать внутренний перевод для генерации списка символов, которые нужно удалить для параметра внешнего перевода.

select TRANSLATE(dirty,'',TRANSLATE(dirty,'','1234567890',''),'') as clean
from (Values 'Nowshak 7,485 m'
             ,'Maja e Korabit (Golem Korab) 2,764 m'
             ,'Tahat 3,003 m','Morro de Moco 2,620 m'
             ,'Cerro Aconcagua 6,960 m (located in the northwestern corner of the province of Mendoza)'
             ,'Mount Kosciuszko 2,229 m','Grossglockner 3,798 m'
      ) as temp(dirty)
2 голосов
/ 12 апреля 2014

Один простой способ сделать это - использовать функцию TRANSLATE (значение, replacewith, replacelist). Он заменяет все символы в списке (третий параметр) значением во втором параметре.

Вы можете использовать это, чтобы по существу стереть все нечисловые символы из строки символов, включая пробелы.

Просто сделайте список в третьем параметре содержащим все возможные символы, которые вы можете увидеть, которые вам не нужны. Переведите их в пустое пространство, и в результате вы получите только те символы, которые вам нужны, по сути, удалив ненужные символы.

Примечание: я включил все обычные символы (не буквенно-цифровые) для удобства других, у которых значения символов могут быть больше, чем в вашем примере.

Select 
   TRANSLATE(UCASE(CHAR_COLUMN),'',
            'ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()-=+/\{}[];:.,<>? ')
FROM TABLE_A

Проще говоря: для вашего конкретного набора значений, поскольку существует гораздо меньший набор возможных символов, вы можете обрезать список замены до следующего:

Select 
   TRANSLATE(UCASE(CHAR_COLUMN),'','ABCDEFGHIJKLMNOPQRSTUVWXYZ(), ')
FROM TABLE_A

ПРИМЕЧАНИЕ: «UCASE» в CHAR_COLUMN не является обязательным, но это было приятное улучшение для упрощения этого выражения за счет исключения необходимости включать все буквенные символы нижнего регистра.

TRANSLATE(CHAR_COLUMN,'',
      'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()-=+/\{}[];:.,<>? ')
1 голос
/ 13 сентября 2018

Просто взяв @ Darryls99 и превратив его в UDF

CREATE OR REPLACE FUNCTION REMOVE_ALLBUT(in_string VARCHAR(32000), characters_to_remote VARCHAR(32000))
RETURNS VARCHAR(32000)
LANGUAGE SQL CONTAINS SQL DETERMINISTIC NO EXTERNAL ACTION
RETURN
TRANSLATE(in_string,'',TRANSLATE(in_string,'',characters_to_remote,''),'')
;

используйте вот так

select DB_REMOVE_ALLBUT(s,'1234567890')
from (values 'Nowshak 7,485 m'
             ,'Maja e Korabit (Golem Korab) 2,764 m'
             ,'Tahat 3,003 m','Morro de Moco 2,620 m'
             ,'Cerro Aconcagua 6,960 m (located in the northwestern corner of the province of Mendoza)'
             ,'Mount Kosciuszko 2,229 m'
             ,'Grossglockner 3,798 m'
      ) t(s);

, который возвращает

 1
 ----
 7485
 2764
 3003
 2620
 6960
 2229
 3798
0 голосов
/ 27 октября 2018

Грязная строка может быть такой: 'qwerty12453lala <<> 777 * 9'

Нам нужно получить очищенную строку и оставить только цифры.

Мы могли бы удалить любые лишние символы с помощью функции ПЕРЕВОД, но есть одна проблема: слишком длинное и некрасивое значение 3-го параметра. Примерно так:

VALUES
(
TRANSLATE( UPPER('qwerty12453lala<<>777*9'), '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()-=+/\{}[];:.,<>? ')
)

Итак, это не очень удобно.

Моя идея - использовать функцию TRANSLATE 2 раза (один раз внутри другого):

  • Рассчитать 3-й параметр как определенный список замененных символов
  • Использовать функцию TRANSLATE во второй раз для замены лишних символов с помощью этого вычисленного параметра

Позвольте мне показать вам здесь код:

VALUES
( 
  REPLACE --Remove spaces from result
  (  
    TRANSLATE
    (
      UPPER( 'qwerty12453lala<<>777*9')
    , ' '
    , TRANSLATE( UPPER( 'qwerty12453lala<<>777*9') , ' ' , '0123456789')-- This is calculation of 3-th param, it contains only NOT digital characters, like 'QWERTYLALA<<>*'
    )
  , ' '
  , ''  
  )  
)    

Результат должен быть таким: 124537779

В случае оператора SELECT это будет выглядеть так:

SELECT REPLACE
       (
         TRANSLATE( UPPER(T.DIRTY_FIELD), ' ', TRANSLATE(UPPER(T.DIRTY_FIELD), '', '1234567890' ) )
       , ' '
       , ''
       )
  FROM SOMETABLE T
0 голосов
/ 08 декабря 2014

Оператор ниже удаляет не алфавитно-цифровые символы из любого «строкового значения» и предотвращает сообщение SQLSTATE 42815 при передаче строкового значения нулевой длины.

SELECT REPLACE(TRANSLATE(string-value || '|',
                        '||||||||||||||||||||||||||||||||',
                        '`¬!"£$%^&*()_-+={[}]:;@~#,<>.?/'''),'|','')
FROM SYSIBM.SYSDUMMY1;
0 голосов
/ 28 февраля 2009

Есть ли способ в IBM DB2 версии 9.5 удалить / удалить все эти нечисловые букв, делая что-то вроде этого:

ВЫБРАТЬ заменить (ДАННЫЕ, - некоторые из регулярное выражение--, '') FROM TABLE_A

или как-нибудь еще?

Нет. Вам нужно будет создать определяемую пользователем функцию или реализовать ее на языке вашего хост-приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...