Станное поведение LTRIM Oracle
Столкнулся со странным поведением LTRIM, функция удаляет лишние символы, см. пример ниже:
select S.CODE_SUBJECT, LTRIM(S.PHONE_NUMBER,'+375'), LTRIM(980337778899,'980')
from shema.table S
where s.phone_number = '+375337778899'
-----------------------------------------------------------------------------
CS789885 7778899 337778899
Oracle 11.2
PHONE_NUMBER VARCHAR2 (4000 BYTE)
NLS_CHARACTERSET AL32UTF8
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_LANGUAGE RUSSIAN
В чем может быть проблема, кодировка, какие-то особенности работы LTRIM?
Ответы (2 шт):
TRIM работает посимвольно, и соответственно последовательность символов 37533 воспринималась как 3753 - 3 (последняя тройка начало новой последовательности).
Пример:
select LTRIM('+3754','+375'), LTRIM('+3753','+375') from dual;
select LTRIM('+3754','+375'), LTRIM('+2752','+275') from dual;
select LTRIM('+3755','+375'), LTRIM('+37522','+3752') from dual;
Для себя перешел на REGEXP_SUBSTR, как более простой вариант можно использовать просто SUBSTR
Функция LTRIM работает в точности как и описано в документации:
LTRIM removes from the left end of char all of the characters contained in set. [...]
Oracle Database begins scanning char from its first character and removes all characters that appear in set until reaching a character not in set and then returns the result.
В последовательнисти [+375337778899] будут удалены все символы слева, которые входят в набор символов [+375]. Проверка идёт слева направо, и при первом несовпадени - 8, остаток будет возвращён как результат - [8899]. Проверено на 11.2.0.1 и 19.0.0.0:
select ltrim (str, '+375') "result" from (
select cast ('+375337778899' as varchar2 (16 byte)) str from dual);
result
----------------
8899
Хорошей альтернативой LTRIM для задачи как в вопросе будет:
select regexp_replace (str, '\+375') "result" from (
select cast ('+375337778899' as varchar2 (16 byte)) str from dual);
result
----------------
337778899