ORACLE TRIM и RTRIM: выбор TRIM (TRAILING ...) с более чем одним символом? - PullRequest
0 голосов
/ 25 июня 2018

Почему в следующем запросе особое значение имеет lette 'm'? Я пытался создать функции TRIM, и я застрял с этим. Или: в чем разница, когда я запрашиваю данные из двойной и другой таблицы.

* 1003 Е.Г. *

Я создал таблицу с одним столбцом и двумя значениями ('adam' и 'apperda')

create table x
(col1 varchar2(20));
insert into x values ('adam');
insert into x values ('apperda');

Затем я выбираю TRIM (TRAILING ...) и RTRIM следующим образом:

select 
col1,
trim(trailing 'am' from col1) traling,
rtrim(col1, 'am') rtim
from x;

И результат: "ad" и "apperd"

COL1                 TRALING              RTIM                
-------------------- -------------------- --------------------
adam                 ad                   ad                  
apperda              apperd               apperd              

Я не понимаю, почему apperd появляется в результате ... Это должно быть сообщение об ошибке, не так ли: ORA-30001: набор обрезки должен иметь только один символ?

Я пробовал два других выбора:

  1. Удалена триммерная (конечная ...) часть выбора.

    select
    col1,
    trim(trailing 'am' from col1) traling
    from x;
    
  2. Выберите из двойного

    select
    trim(trailing 'am' from 'apperda'),
    from dual;
    

Оба запроса дают мне сообщение об ошибке:

ORA-30001: набор обрезки должен содержать только один символ

Строка с плюсом в запросе предоставляет информацию о плюсе? Или как это возможно? И это не просто вопрос вопроса, а, похоже, два данных (adam и apperda) взаимодействуют:

Я создаю простой запрос с apperda, и он показывает ошибку:

select 
trim(trailing 'am' from 'apperda') traling,
rtrim('apperda', 'am') rtim
from dual

ORA-30001: набор обрезки должен содержать только один символ


основной пример (2018-07-05)

create table trims
(col varchar2(20));

insert into trims values ('dream');

select
    trim(trailing 'am' from col)
    rtrim(col, 'am')
from trims;

Первая строка в выборе должна выдавать ошибку ORA-30001, потому что в кадре есть два символа (завершающий ...). Но скрипт запускается:

TRIM(TRAILING'AM'FROMCOL)   RTRIM(COL,'AM')
-----------------------------------------------
dre                         dre

И еще: кажется, что триммер (trailin ...) зависит от rtrim (...) - если стереть rtrim (...), сообщение об ошибке появляется как должно быть.

select
    trim(trailing 'am' from col)
    --rtrim(col, 'am')
from trims;
`ORA-30001: trim set should have only one character`

1 Ответ

0 голосов
/ 02 декабря 2018

Мне интересно, является ли это побочным эффектом какой-то оптимизации ядра. Фактически trim(trailing 'am' from col) и rtrim(col, 'am') - это одна и та же операция. Поэтому кажется, что если мы выполним rtrim(col, 'am') секунду, Oracle не будет беспокоить trim(trailing 'am' from col), а просто вернет результат rtrim().

Следовательно, пока эти запросы возвращают усеченные результаты ...

select
    trim(trailing 'am' from col)
    , rtrim(col, 'am')
from trims;
/

select
    trim(trailing 'ax' from col)
    , rtrim(col, 'ax')
from trims;
/

... переключение порядка выполнения бросков ORA-30001: trim set should have only one character:

select
    rtrim(col, 'am')
    , trim(trailing 'am' from col)
from trims;
/

Так же, предоставляя различные значения для обрезки:

select
    trim(trailing 'am' from col)
    , rtrim(col, 'ax')
from trims;
/

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

...