Как найти несколько строк из одного значения столбца, используя Oracle SQL - PullRequest
0 голосов
/ 02 февраля 2019

Ниже приведено значение столбца CLOB в одной из моих таблиц.Это значение содержит множество путей к изображениям.

<p><img alt="" src="/library/NATIONWIDE/CCS_SUPPORT/Emmy2.jpg" style="height:67px; width:50px" /></p>
<p><img alt="" src="/library/NATIONWIDE/CCS_SUPPORT/Emmy%201.jpg" style="height:133px; width:100px" />Please test this document</p>
<p>&nbsp;</p>
<p><img alt="" src="/library/NATIONWIDE/CCS_SUPPORT/Kenny.jpg" style="height:250px; width:200px" /></p>
<p>&nbsp;</p>

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

SELECT REGEXP_SUBSTR(contentdata.xml, '/library/NATIONWIDE/.* style') AS xml_substr
FROM contenttext 
WHERE 
    contenttext.xml LIKE '%img alt=%'
    AND contenttext.documentid LIKE 'SPT91%'
    AND contenttext.published = 'Y';

Вывод моего запроса:

/library/NATIONWIDE/CCS_SUPPORT/Emmy2.jpg" style

Можете ли вы указать мне, как получить все пути к изображениям?

Спасибо, Кишоре Куна

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Этот SQL не требует подключения.Используя опцию 'm', regexp_replace обрабатывает каждую строку как отдельную строку.Я поставил два аргумента, разделенных 'или' (вертикальная черта).Первая строка - это желаемая строка, вторая строка - это все остальное.

Сохраняется только нужная строка ('\ 1'), но дополнительные возвраты каретки все еще есть, поэтому окружающее regexp_replace для удаления несколькихвозврат каретки.

-- Just setting up a test dataset
WITH aset AS( SELECT '<p><img alt="" src="/library/NATIONWIDE/CCS_SUPPORT/Emmy2.jpg" 
style="height:67px; width:50px" /></p>
<p><img alt="" src="/library/NATIONWIDE/CCS_SUPPORT/Emmy%201.jpg" 
style="height:133px; width:100px" />Please test this document</p>
<p>nbsp;</p>
<p><img alt="" src="/library/NATIONWIDE/CCS_SUPPORT/Kenny.jpg" style="height:250px; 
width:200px" /></p>
<p>nbsp;</p>' test FROM DUAL )
-- Magic starts here
SELECT test
     , regexp_replace( REGEXP_REPLACE( test
                                 , '(^.*/library/NATIONWIDE/.*$)|(.*$)'
                                 , '\1'
                                 , 1
                                 , 0
                                 , 'im' )
                 , CHR( 10 ) || '+'
                 , CHR( 10 ) )    one
  FROM aset

Это привело к следующему:

<p><img alt="" src="/library/NATIONWIDE/CCS_SUPPORT/Emmy2.jpg" style="height:67px; width:50px" /></p>
<p><img alt="" src="/library/NATIONWIDE/CCS_SUPPORT/Emmy%201.jpg" style="height:133px; width:100px" />Please test this document</p>
<p><img alt="" src="/library/NATIONWIDE/CCS_SUPPORT/Kenny.jpg" style="height:250px; width:200px" /></p>
0 голосов
/ 02 февраля 2019

Oracle REGEXP_SUBSTR возвращает первое совпадение в строке.Вы можете использовать предложение CONNECT BY для рекурсивного анализа строки:

SELECT REGEXP_SUBSTR(x.xml, '/library/NATIONWIDE/.* style', 1, LEVEL) AS xml_substr
FROM ( 
    SELECT xml
    FROM contenttext 
    WHERE 
        contenttext.xml like '%img alt=%' 
        AND contenttext.documentid like 'SPT91%'
        AND contenttext.published = 'Y'
) x
CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(x.xml, '/library/NATIONWIDE/.* style')) + 1;
...