2009-08-05 2 views
0

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

11.10.32. .U.A.F.3.2.21.249.1

2001.1.1003. .A.LE.P.P

2010.1.1003. .A.LE.B.B

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

Мой второй запрос будет что-то вроде этого:

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

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

начинающих

ответ

0

работы с 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 

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

+0

Я получаю следующее сообщение об ошибке, когда я запускаю выше query: ORA: 00923: FROM ключевое слово не найдено там, где ожидалось :( – novice

+0

У меня нет экземпляра Oracle для тестирования, но единственное, что я могу видеть, это «+1» в первом INSTR. Вы уверены, что у вас есть пространство между именем FROM и таблицей в том, что вы пытались запустить? –

0

Новые версии 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

Я выполнил ваш запрос и получил следующую ошибку: ORA-01722: неверный номер Любые предложения? – novice

+0

Думаю, я предположил, что ваш «sncode» тоже был строкой. Дайте мне знать, действительно ли это число. Тем временем я обновляю свой ответ, чтобы отразить это, поэтому вы можете попробовать его (функция «to_number»). – epost

+0

спасибо. sncode на самом деле является числом. otname является буквенно-цифровым – novice

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