Удалить персонажа из заданной позиции в Oracle - PullRequest
2 голосов
/ 27 мая 2010

Есть ли способ удалить персонажа из заданной позиции?

Скажем, мое слово: БЛИНЫ И я хочу удалить 2-ю букву (в данном случае, 'A'), поэтому я хочу, чтобы в качестве моего возвращения были PNCAKES.

Перевести не работает для этого. Заменить не работает для этого. Regex чертовски сложно ...

Идеи

Ответы [ 5 ]

4 голосов
/ 27 мая 2010

Пример:

SUBSTR('PANCAKES', 0, INSTR('PANCAKES', 'A', 1, 1)-1) || SUBSTR('PANCAKES', INSTR('PANCAKES', 'A', 1, 1)+1)

У меня нет экземпляра Oracle для тестирования, возможно, придется настроить -1 / + 1, чтобы получить правильную позицию.

Ссылки:

3 голосов
/ 19 сентября 2012

Вам настоятельно рекомендуется использовать regexp_replace. Он короче и не так сложен, как кажется на первый взгляд:

SELECT REGEXP_REPLACE( S, '^(.{1}).', '\1' )
FROM (
  SELECT 'PANCAKES'
  FROM DUAL
)

Шаблон ^(.{1}). ищет в начале строки (обозначается ^) ровно один (.{1}) печатных или обновляемых символов, а затем снова только один из этих символов (.). «Точная» часть закрыта в скобках, поэтому на нее можно ссылаться как на группу соответствия по номеру в аргументе третьей функции (\1). Таким образом, вся подстрока, соответствующая регулярному выражению, равна 'PA', но мы ссылаемся только на 'P'. Остальная часть строки остается нетронутой. Таким образом, результат «PNCAKES».

Если вы хотите удалить N-й символ из строки, просто замените номер «один» в шаблоне (используется для удаления второго символа) значением N-1.

Для программиста или любого ИТ-специалиста полезно ознакомиться с регулярными выражениями, поскольку это дает ему или ей много возможностей для работы с текстовыми записями.

1 голос
/ 15 мая 2013

Или используйте пользовательскую функцию SplitAtPos, используя SUBSTR. Преимущество заключается в том, что он все еще работает на Oracle v9.

set serveroutput on
declare

s1 varchar2(1000);
s2 varchar2(1000);

function SplitAtPos(s in out varchar2, idx pls_integer)
    return varchar2
is
    s2 varchar2(1000);
begin
    s2:=substr(s,1,idx-1);
    s:=substr(s,idx,length(s)-idx+1);
    return s2;
end;

begin
s1:='Test123';
s2:=SplitAtPos(s1,1);
dbms_output.put_line('s1='||s1||' s2='||s2);

s1:='Test123';
s2:=SplitAtPos(s1,5);
dbms_output.put_line('s1='||s1||' s2='||s2);

s1:='Test123';
s2:=SplitAtPos(s1,7);
dbms_output.put_line('s1='||s1||' s2='||s2);

s1:='Test123';
s2:=SplitAtPos(s1,8);
dbms_output.put_line('s1='||s1||' s2='||s2);

s1:='Test123';
s2:=SplitAtPos(s1,0);
dbms_output.put_line('s1='||s1||' s2='||s2);

end;
0 голосов
/ 23 января 2015

Вы можете использовать что-то вроде этого в pl/SQL

DECLARE 
    v_open    NUMBER;
    v_string1 VARCHAR2(10);
    v_string2 VARCHAR2(10);
    v_word    VARCHAR2(10);
BEGIN
    v_open := INSTR('PANCAKES' ,'A',1);
    v_string1 := SUBSTR('PANCAKES' ,1, 1);
    v_string2 := SUBSTR('PANCAKES' ,v_open+1);
    v_word    := v_string1||v_string2;
END;
0 голосов
/ 27 мая 2010

да REPLACE и SUBSTR в правильном порядке добьются цели.

конечным результатом должна быть конкатенация SUBSTR до удаленного символа в SUBSTR после символа.

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

...