#regex #oracle #replace
#регулярное выражение #Oracle #заменить
Вопрос:
У меня есть строка, подобная приведенной ниже.
‘comp’ как «КОМПЬЮТЕР», ‘ms’ как «МЫШЬ», ‘keybr’ как «КЛАВИАТУРА», ‘MONT’ как «МОНИТОР»,
Можно ли написать запрос, чтобы я получил результат в виде
‘comp’,’ms’,’keybr’,’MONT’ ,
Я могу заменить строку «как» пустой строкой, используя запрос REPLACE. Но как мне удалить строку внутри двойных кавычек?
Кто-нибудь может мне помочь в этом? Заранее спасибо.
Ответ №1:
select replace(
regexp_replace('''comp'' as "COMPUTER"'
, '(".*")'
,null)
,' as '
,null)
from dual
Регулярное выражение '(".*")'
выбирает текст, заключенный в двойные кавычки.
Редактировать:
регулярное выражение заменило всю длину соответствующего шаблона. Итак, нам может потребоваться сначала обозначить строку, используя запятую в качестве разделителя, и применить регулярное выражение. Позже присоединитесь к нему.( LISTAGG
)
WITH str_tab(str1, rn) AS
(SELECT regexp_substr(str, '[^,] ', 1, LEVEL), -- delimts
LEVEL
FROM (SELECT '''comp'' as "computer",''comp'' as "computer"' str
FROM dual) tab
CONNECT BY LEVEL <= LENGTH(str) - LENGTH(REPLACE(str, ',')) 1)
SELECT listagg(replace(
regexp_replace(str1
, '(".*")'
,null)
,' as '
,null), ',') WITHIN GROUP (ORDER BY rn) AS new_text
FROM str_tab;
ПРАВКА2:
Более чистый подход от @EatAPeach
with x(y) as (
select q'<'comp' as "COMPUTER",'ms' as "MOUSE" ,'keybr' as "KEYBOARD",'MONT' as "MONITOR",>'
from dual
)
select y,
regexp_replace(y, 'as ".*?"' ,null)
from x;
Комментарии:
1. Я попробовал этот способ — выберите replace( regexp_replace(«‘comp» как «КОМПЬЮТЕР», «ms» как «МЫШЬ», «keybr» как «КЛАВИАТУРА», «MONT» как «МОНИТОР»,’ , ‘(«.*»)’ , null) ,’ как ‘, null) из dual
2. Я получаю только это: ‘comp’,
3. Не могли бы вы мне помочь
4. @OracleUser, нет необходимости в маркировке и агрегировании. Вы можете использовать не жадный квантификатор, .*? в вашем первом запросе.