2015-12-22 4 views
0

Учитывая эту строку:Заменить последнее вхождение подстроки

.abc, 0,123, .FGH, .QDG

Как наиболее эффективно использовать PL/SQL для вывода:

азбука, 123, FGH и QDG

до сих пор я получил LOWER(REPLACE('.ABC,.123,.FGH,.QDG', '.', ' ')), что уг полей

азбука, 123, FGH, QDG

Как я понимаю, что "и" после "FGH", но до "QDG" ("FGH и QDG")? Должен ли я пользователь INSTR() и SUBSTR(), или есть функция, которая может просто заменить последнее пространство на «и»?

ответ

3

Опираясь на то, что вы использовали уже ... использовать regexp_replace с instr

with cte as(
select LOWER(REPLACE('.ABC,.123,.FGH,.QDG', '.', ' ')) as val from dual) 
select regexp_replace(val,' ',' and ',instr(val ,' ',-1)) 
from cte; 

или regexp_replace(val,', ',' and ',instr(val ,', ',-1)), если вы хотите, чтобы избавиться от последней запятой тоже.

enter image description here

+0

Это получает головокружение, потому что его легче реализовать в блоке выполнения PL/SQL. –

1

Это будет делать это:

select substr(text, 1, last_space_pos) || 'and' || substr(text, last_space_pos) new_text 
from 
(select text, instr(text, ' ', -1) last_space_pos 
from 
(select LOWER(REPLACE('.ABC,.123,.FGH,.QDG', '.', ' ')) text from dual) 
); 

Вызов функции instr(text, ' ', -1) находит позицию последнего пространства, и substr вызов разорвать строку в этой точке, так что мы можем вставить «и ». Использование вложенных операторов select позволяет избежать повторения любых сложных выражений.

+0

Также полезное решение; Спасибо. –

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