2013-09-09 3 views
0

В настоящее время я работаю над упражнением, которое отобразит определенный текст, например TESTTEMP, из последовательности символов, хранящихся в столбце. Пример строки:String Manipulation в Oracle 11g

PROGRAMNAME|MAX2112ETI_L;PROGRAMREV|L;TESTOPTION|FR;TESTTEMP|25;STD IPH|528.63436123348 

Теперь то, что мне нужно, чтобы извлечь текст мимо строки TESTTEMP| и перед ;. То, что я сделал, - это извлечь весь текст за TESTTEMP| и просто получить первые два символа. К сожалению, это будет невозможно, так как есть случаи, когда в TESTTEMP| есть 3 символа. Есть ли способ, чтобы я мог это сделать? Ниже приводится то, что у меня есть до сих пор:

SELECT 
    SUBSTR(SUBSTR(value, INSTR(value, ';TESTTEMP|')+10), 1, 2) invalue 
FROM 
(
    SELECT 
    'PROGRAMNAME|MAX2112ETI_L;PROGRAMREV|L;TESTOPTION|FR;TESTTEMP|25;STD IPH|528.63436123348' VALUE 
    FROM dual 
)t; 
+3

'REGEXP_SUBSTR (значение '(; | ^) TESTTEMP \ | (\ d +) (; | $)', 1, 1, '', 2) ' –

+1

Используйте REGEXP_SUBSTR, как Егор сказал - это более элегантный способ синтаксического анализа сложной строки, чем серия SUBSTR и INSTR. – denied

+0

привет denier, но это не работает на 3-х значных и отрицательных тестах. – GianIsTheName

ответ

1

Найти индекс; в подстроку и использовать его в качестве индекса вместо жесткого кодирования его 2.

SELECT 
    SUBSTR(SUBSTR(value, INSTR(value, ';TESTTEMP|')+10), 1, INSTR(SUBSTR(value, INSTR(value, ';TESTTEMP|')+10), ';')-1) invalue 
FROM 
(
    SELECT 
    'PROGRAMNAME|MAX2112ETI_L;PROGRAMREV|L;TESTOPTION|FR;TESTTEMP|25;STD IPH|528.63436123348' VALUE 
    FROM dual 
)t; 

Если это выглядеть грязным, вы можете даже написать это

SELECT 
    SUBSTR(VALUE, 1, INSTR(VALUE, ';') - 1) invalue 
FROM 
(
    SELECT 
    SUBSTR(VALUE, INSTR(VALUE, ';TESTTEMP|') + 10) 
    VALUE 
    FROM (
     SELECT 
     'PROGRAMNAME|MAX2112ETI_L;PROGRAMREV|L;TESTOPTION|FR;TESTTEMP|25;STD IPH|528.63436123348' 
     VALUE 
     FROM dual) t 
)t; 

На основе замечаний - если вы хотите знать, была ли строка найдена или нет, используйте этот запрос. FOUND будет больше 0, если строка найдена.

SELECT 
    SUBSTR(VALUE, 1, INSTR(VALUE, ';')-1) invalue, FOUND 
FROM 
(
    SELECT 
    SUBSTR(VALUE, INSTR(VALUE, SEARCHSTRING)+10) VALUE, INSTR(VALUE, SEARCHSTRING) FOUND 
    FROM (
     SELECT 
     'PROGRAMNAME|MAX2112ETI_L;PROGRAMREV|L;TESTOPTION|FR;TESTTEMP|25;STD IPH|528.63436123348' 
     VALUE, 
     ';TESTTEMP|' SEARCHSTRING 
     FROM dual) t 
)t; 
+0

Здравствуйте, Lobo, ваш код работает хорошо. У меня только вопрос. Что делать, если TESTTEMP не находится в строке? Я предполагаю, что он вернет неправильное значение. – GianIsTheName

+0

Привет, Лобо, я обновил ответ :) – GianIsTheName

+1

@GianIsTheName Я изменил запрос, чтобы сообщить вам, найден ли строка поиска или нет. – Lobo