select translate(' @',' ','') from dual;
Возвращает NULL
, потому что в Oracle пустые строки, к сожалению, дают NULL
с. Следовательно, это эквивалентно
SELECT translate(' @', ' ', NULL)
FROM dual;
и translate()
возвращает NULL
, когда аргумент равен нулю. На самом деле это хорошо задокументировано в «ПЕРЕВОД» :

(...)
Нельзя использовать пустую строку для to_string
, чтобы удалить все символы в from_string
из возвращаемого значения. Oracle Database интерпретирует пустую строку как ноль, и если эта функция имеет нулевой аргумент, то она возвращает ноль.
Если вы хотите заменить один символ, используйте replace()
, как вы уже сделали. Для нескольких, но более чем одного символа вы можете вкладывать replace()
s.
Это, однако, становится неудобным, когда вы хотите заменить довольно много символов. В такой ситуации, если заменяющим символом является только один символ или пустая строка regexp_replace()
с использованием класса символов или альтернатив, может оказаться полезным.
Например
SELECT regexp_replace('a12b478c01', '[0-9]', '')
FROM dual;
заменяет все цифры, поэтому остается 'abc'
и
SELECT regexp_replace('ABcc1233', 'c|3', '')
FROM dual;
удаляет все '3'
или 'c'
и приводит к 'AB12'
. В вашем самом примере
SELECT regexp_replace(' @', ' ', '')
FROM dual;
также сработает и даст вам '@'
. Хотя в простом случае вашего примера достаточно простого replace()
.