2009-02-27 7 views
2

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

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... 
--------------------- 

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

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

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

спасибо :)

+0

Какая платформа вы используете? – Quassnoi

+0

IBM DB2 версии 9.5 (Новая версия, поддерживающая хранение XML изначально.) – natch3z

ответ

2

В 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

Извините. Я забыл упомянуть, что я использую DB2 версии 9.5. – natch3z

+0

никогда не знал, что вы можете использовать регулярное выражение в sql +1 –

+0

можете ли вы разместить его для MSSQL Server? –

2

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

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

ПЕРЕВЕСТИ ('данные', 'а ... XYZ,/\ <> |.? [и так далее]', ' «)

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

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

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

-1

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

+0

Это ужасно медленно. – Hogan

4

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

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

DATA = 'Nowshak 7,485 m' 

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

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

+0

Здесь вам не нужно 'REPLACE', если первый параметр' '' ', он удалит все эти символы. Вы также можете использовать функцию «UPPER», чтобы вам не приходилось перечислять символы нижнего регистра. – Hogan

+0

@Hogan, 'TRANSLATE()' требует того же количества символов во втором параметре, что и в третьем, поэтому требуется REPLACE (по крайней мере, на моей версии 9.x DB2). Кроме того, использование 'UPPER()' будет работать и упрощает команду translate, но я не уверен, что это более эффективно в целом. –

+0

Посмотрите на последний пример, он удаляет 'u' http://www.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.sql.ref.doc/doc/r0000862. html Используете ли вы версию до 9.7? :) поэтому 'TRANSLATE (x, '1234567890', '1234567890 ....')' будет работать нормально. – Hogan

Смежные вопросы