Как я могу извлечь строку в Oracle
Я хотел бы извлечь следующую строку в Oracle. Как я могу это сделать?
- Исходная строка:
011113584378(+) CARD, STAFF
- Ожидаемая строка:
STAFF CARD
2 ответа
Хорошо, я укушу Этот пример использует REGEXP_REPLACE для описания строки, сохраняя части, которые вам нужны, чтобы переставить их перед возвратом. Было бы лучше, если бы вы показали несколько реальных примеров данных, с которыми вы имеете дело, поскольку я могу только гарантировать, что этот пример будет работать с той строкой, которую вы указали.
Регулярное выражение совпадает с любыми символами, начинающимися в начале строки и заканчивающимися близким пробелом. Следующий набор любых символов до или без запятой "запоминается", заключая их в скобки. Это называется захваченной группой. Следующая захваченная группа - это набор символов после этого разделителя запятых до конца строки (знак доллара). Захваченные группы упоминаются в порядке их следования слева направо. Третий аргумент - это возвращаемая строка, которая является 2-й и 1-й захваченными группами в указанном порядке, разделенными пробелом.
SQL> with tbl(str) as (
select '+011113584378(+) CARD, STAFF' from dual
)
select regexp_replace(str, '^.*\) (.*), (.*)$', '\2 \1') formatted
from tbl;
FORMATTED
----------
STAFF CARD
SQL>
Я полагаю, у вас есть возможность написать функцию PL/SQL? Затем просто используйте "SUBSTR" и / или "INSTR", и ||
оператор конкатенации для анализа вашего ввода.
Вот пример:
https://www.techonthenet.com/oracle/questions/parse.php
... Поле может содержать следующее значение:
F:\Siebfile\YD\S_SR_ATT_1-60SS_1-AM3L.SAF
В этом случае мне нужно вернуть значение "1-60SS", так как это значение находится между 3-м и 4-м подчеркиванием.
РЕШЕНИЕ:
create or replace function parse_value (pValue varchar2)
return varchar2
is
v_pos3 number;
v_pos4 number;
begin
/* Return 3rd occurrence of '_' */
v_pos3 := INSTR (pValue, '_', 1, 3) + 1;
/* Return 4rd occurrence of '_' */
v_pos4 := INSTR (pValue, '_', 1, 4);
return SUBSTR (pValue, v_pos3, v_pos4 - v_pos3);
end parse_value;