Станное поведение 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 шт):

Автор решения: Andrew B

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

→ Ссылка
Автор решения: 0xdb

Функция 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
→ Ссылка