Чтение части буквенно-цифровой строки в SQL - PullRequest
0 голосов
/ 05 августа 2009

У меня есть таблица с одним столбцом "otname" table1.otname содержит несколько строк буквенно-цифровой строки, напоминающей следующую выборку данных:

11.10.32. 12 .U.A.F.3.2.21.249.1

2001.1.1003. 8281 .A.LE.P.P

2010.1.1003. 8261 .A.LE.B.B

Я хочу прочитать четвертое число в каждой строке (часть строки, выделенную жирным шрифтом) и написать запрос в Oracle 10g прочитать его описание, хранящееся в другой таблице. Моя дилемма пишет первую часть query.i.e. выбирая четвертое число каждой строки в таблице

Мой второй запрос будет выглядеть примерно так:

select description_text from table2 where sncode = 8281  -- fourth part of the data sample in every string

Большое спасибо.

новичок

Ответы [ 2 ]

0 голосов
/ 05 августа 2009

Более новые версии oracle (включая 10g) имеют различные функции регулярных выражений. Таким образом, вы можете сделать что-то вроде этого:

where sncode = to_number(regexp_replace(otname, '^(\d+\.\d+\.\d+\.(\d+))?.+$', '\2'))

Это соответствует 3 наборам цифр, следующих за точкой, и четвертому сгруппированному набору цифр, за которым следует остальная часть строки, и возвращает строку, состоящую из всего, что полностью заменено первой группой четвертый набор цифр).

Вот полный запрос (если я правильно понял ваше описание двух таблиц):

select t2.description_text
from table1 t1, table2 t2
where t2.sncode = to_number(regexp_replace(t1.otname, '^(\d+\.\d+\.\d+\.(\d+))?.+$', '\2'))

Еще одно более короткое альтернативное регулярное выражение:

where t2.sncode = to_number(regexp_replace(t1.otname, '^((\d+\.){3}(\d+))?.+$', '\3'))
0 голосов
/ 05 августа 2009

Работает с 9i +:

WITH portion AS (
  SELECT SUBSTR(t.otname, INSTR(t.otname, ".", 1, 3)+1, INSTR(t.otname, ".", 1, 4)) 'sncode'
    FROM TABLE t)
SELECT t.description_text
  FROM TABLE2 t
  JOIN portion p ON p.sncode = t.sncode

Использование SUBSTR должно быть очевидным; INSTR используется для определения местоположения точки (.), Начиная с первого символа в строке (значение параметра 1), по 3-му и 4-му появлению в строке. Возможно, вам придется вычесть одно из позиции, возвращенной для 4-го экземпляра периода - сначала проверьте это, чтобы убедиться, что вы получаете правильные значения:

SELECT SUBSTR(t.otname, INSTR(t.otname, ".", 1, 3)+1, INSTR(t.otname, ".", 1, 4)) 'sncode'
 FROM TABLE t

Я использовал факторинг подзапроса, чтобы подстрока появлялась до того, как вы присоединитесь ко второй таблице. Это можно сделать как подзапрос, но факторинг подзапроса выполняется быстрее.

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