Несколько ЗАМЕНЯЮТ функцию в Oracle

Я использую REPLACE функция в оракуле для замены значений в моей строке как;

 SELECT REPLACE('THE NEW VALUE IS #VAL1#','#VAL1#','55') from dual

Таким образом, это в порядке для замены одного значения, но что относительно 20 +, должен я использовать 20 + REPLACE функционируйте или есть ли более практическое решение.

Все идеи приветствуются.

22
задан Adnan 1 June 2010 в 06:18
поделиться

2 ответа

Имейте в виду, что

SELECT REPLACE(REPLACE('TEST123','123','456'),'45','89') FROM DUAL;

заменит 123 на 456, а затем обнаружит, что он может заменить 45 на 89. Для функции, которая имела эквивалентный результат, она должна была бы дублировать приоритет (т. Е. Заменять строки в том же порядке).

Аналогичным образом, взяв строку «ABCDEF» и указав ей заменить «ABC» на «123» и «CDE» на «xyz», все равно придется учитывать приоритет, чтобы определить, перешла ли она к «123EF» или ABxyzF '.

Короче говоря, было бы сложно придумать что-то общее, что было бы проще, чем вложенная REPLACE (хотя что-то, что больше похоже на функцию стиля sprintf, было бы полезным дополнением).

22
ответ дан 29 November 2019 в 03:22
поделиться

Принятый ответ на , как заменить несколько строк вместе в Oracle , предлагает использовать вложенные операторы REPLACE , и я не думаю, что это есть это лучший способ.

Если вы собираетесь интенсивно использовать это, вы можете написать свою собственную функцию:

CREATE TYPE t_text IS TABLE OF VARCHAR2(256);

CREATE FUNCTION multiple_replace(
  in_text IN VARCHAR2, in_old IN t_text, in_new IN t_text
)
  RETURN VARCHAR2
AS
  v_result VARCHAR2(32767);
BEGIN
  IF( in_old.COUNT <> in_new.COUNT ) THEN
    RETURN in_text;
  END IF;
  v_result := in_text;
  FOR i IN 1 .. in_old.COUNT LOOP
    v_result := REPLACE( v_result, in_old(i), in_new(i) );
  END LOOP;
  RETURN v_result;
END;

, а затем использовать ее следующим образом:

SELECT multiple_replace( 'This is #VAL1# with some #VAL2# to #VAL3#',
                         NEW t_text( '#VAL1#', '#VAL2#', '#VAL3#' ),
                         NEW t_text( 'text', 'tokens', 'replace' )
                       )
FROM dual

Это текст с некоторыми токенами для замены

Если все ваши токены имеют тот же формат ( '# VAL' || i || '#' ), вы можете опустить параметр in_old и использовать вместо него счетчик циклов.

22
ответ дан 29 November 2019 в 03:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: