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

Предположим, есть таблица "A" с 2 столбцами - ID (INT), DATA (VARCHAR (100)). Выполнение «SELECT DATA FROM A» приводит к тому, что таблица выглядит следующим образом:

DATA
---------------------
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
// the DATA continues...
---------------------

Как можно извлечь только числовые данные с помощью какой-либо функции обработки строк в запросе SELECT SQL, чтобы результат модифицированного SELECT выглядел так:

DATA (in INTEGER - not varchar)
---------------------
7485
2764
3003
2620
6960
2229
3798
// the DATA in INTEGER continues...
---------------------

Кстати, было бы лучше, если бы это можно было сделать одним оператором SQL. (Я использую IBM DB2 версии 9.5)

Спасибо:)

Ответы [ 4 ]

4 голосов
/ 26 августа 2011

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

Самый простой способ сделать это - TRANSLATE все ненужные символы в один символ, затем REPLACE этот единственный символ с пустой строкой.

DATA = 'Nowshak 7,485 m'

# removes all characters, leaving only numbers
REPLACE(TRANSLATE(TRIM(DATA), '_____________________________________________________________________________________________', ' abcdefghijklmnopqrstuvwzyaABCDEFGHIJKLMNOPQRSTUVWXYZ`~!@#$%^&*()-_=+\|[]{};:",.<>/?'), '_', '')
 => '7485'

Чтобы сломать команду TRANSLATE:

TRANSLATE( FIELD or String, <to characters>, <from characters> )

, например

DATA = 'Sample by John'

TRANSLATE(DATA, 'XYZ', 'abc')
 => a becomes X, b becomes Y, c becomes Z
 => 'SXmple Yy John'

** Примечание: я не могу говорить о производительности или совместимости версий. У меня версия DB2 9.x, и я новичок в этой технологии. Надеюсь, это кому-нибудь поможет.

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

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

(Да, это длинный список, очень длинный список, поэтому я говорю, что он не идеален)

TRANSLATE ('data', 'abc ... XYZ,. / \ <>? | [И т. Д.]', '')

В качестве альтернативы вам нужно создать пользовательскую функцию для поиска номера. Есть несколько альтернатив для этого.

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

  2. Если вы знаете, что предшествует числу, а что следует за числом, вы можете искать их и сохранять то, что находится между ...

2 голосов
/ 27 февраля 2009

В Oracle:

SELECT TO_NUMBER(REGEXP_REPLACE(data, '[^0-9]', ''))
FROM a

В PostgreSQL:

SELECT CAST(REGEXP_REPLACE(data, '[^0-9]', '', 'g') AS INTEGER)
FROM a

В MS SQL Server и DB2 вам необходимо создать UDF для регулярных выражений и запросов, подобных этому.

См. Ссылки для более подробной информации.

0 голосов
/ 19 июня 2009

Для уточнения предложения Демса я использовал скалярную пользовательскую функцию (UDF), которая принимает буквенно-цифровую строку и рекурсивно выполняет итерацию по строке (один байт на итерацию) и подавляет нечисловые символы из выход. Рекурсивное выражение будет генерировать строку для каждой итерации, но только последняя строка сохраняется и возвращается вызывающему приложению.

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