2017-02-09 5 views
-1

У меня есть столбец в таблице, где данные хранятся в формате нижеХочет, чтобы извлечь текст из тега

<Server start> 
    <message tagid=" ">false</message> 
    <message tagid="34">no data found</message> 
    <message tagid=" ">false</message> 
    <Server stop> 

Где мне нужно, чтобы извлечь «не найденные данных». Пробовал использовать функцию regexp replace, но не смог сделать ее правильно.

Примечание: идентификатор сообщения (номер) может быть любой длины.

+0

Можете ли вы показать нам, что на самом деле выглядит таблица и данные? – BobC

+0

Действительно? Вам нужно извлечь «данные не найдены», независимо от того, где он находится? Тогда просто сделайте 'select 'no data found' from ...' OK, так что это ** не ** требование, не так ли? Что вам нужно извлечь - сообщение, в котором теги не является одним пробелом? Что, если есть более одного такого сообщения? – mathguy

+0

@mathguy сообщение заполнено динамически, поэтому я не смог извлечь напрямую, используя select. Затем могут быть несколько теги сообщений, но только один идентификатор тега будет иметь номер и соответствующее ему сообщение. Поэтому мне нужно найти теги, которые содержат число. – user3928562

ответ

0

Постарайтесь построить запрос на основе следующего кода. Во-первых преобразования текста в XML, а затем извлечь neccesary данных с помощью функции

with test_query as (select XMLType(replace(replace(s,'<Server stop>','</Server>'),'<Server start>','<Server>')) xml from 
(select '<Server start> 
    <message tagid=" ">false</message> 
    <message tagid="34">no data found</message> 
    <message tagid=" ">false</message> 
    <Server stop>' as s from dual)) 
    select 
     t.xml.extract('//message[position()=2]/text()') out 
    from test_query t; 
+0

Фактическое положение сообщения tagid, которое содержит код ошибки, не исправлено. Например, он может отображаться во 2-й позиции для id 1, он может отображаться в 5-й позиции для id 2 и 1-й позиции для id 3. Нам в основном нужен запрос, который может извлекать текст ошибки независимо от позиции tagid сообщения. Как вы думаете, regex_replace может решить эту проблему? – user3928562

+0

, если вы не знаете точное положение, замените в моем запросе t.xml.extract ('// message [position() = 2]/text()') out by t.xml.extract ('// message [@ tagid! = ""]/text() ') out – Jgrammer

1

Запрос() XMLType.extract:

SELECT x.tagid, 
     x.message 
FROM your_table t 
     CROSS JOIN 
     XMLTable(
     '/Server/message' 
     PASSING XMLType(
        REPLACE(
        REPLACE(t.your_column, '<Server start>', '<Server>'), 
        '<Server stop>', 
        '</Server>' 
        ) 
       ) 
      COLUMNS tagid VARCHAR2(100) PATH './@tagid', 
        message VARCHAR2(400) PATH './text()' 
     ) x; 

Выход

TAGID MESSAGE 
----- ------- 
     false 
34 no data found 
     false 

Если вы просто хотите значения, где сообщение no data found, затем добавьте WHERE cla используйте в конце запроса:

WHERE x.message = 'no data found'; 
+0

Вернее, из комментария OP ниже вопроса, где tagid не равно null. Или возможно! = ''. – mathguy

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

  • Нет связанных вопросов^_^