Почему функция LTRIM не возвращает ожидаемый результат

#sql #oracle #plsql

#sql #Oracle #plsql

Вопрос:

Я пытаюсь получить название местоположения после заголовка из столбца. Примером названия должности является ‘Manager — Майами’. Я пытаюсь выполнить следующее,

  SELECT UPPER(LTRIM('Manager - Miami', 'Manager - ')) FROM DUAL
  

Я ожидаю, что результат будет MIAMI , но он возвращает только IAMI .

Ответ №1:

В Oracle вторым аргументом LTRIM() является список символов. По умолчанию они чувствительны к регистру.

Итак, 'm' это первый символ в, ''Manager - Miami' которого нет в 'District Manager - ' , поэтому все, что до него, удаляется.

Я могу предположить, что вам действительно нужно какое-то regexp_substr() или regexp_replace() , но вы на самом деле не указываете логику.

Комментарии:

1. Спасибо за объяснение. Это было удаление всех символов из ‘set’. Комбинация SUBSTR и INSTR сработала идеально.

2. @Priom . . . Если бы вы объяснили, чего вы хотели достичь, я, вероятно, ответил бы и на это.

Ответ №2:

(L)ОБРЕЗАТЬ? Почему вы использовали бы ее для возврата «Miami»? Я бы выбрал SUBSTR INSTR , как в этом примере (CTE просто для того, чтобы мне не пришлось повторять строку несколько раз).

 SQL> with test (col) as
  2    (select 'Manager - Miami' from dual)
  3  select trim(substr(col, instr(col, '-')   1)) result
  4  from test;

RESUL
-----
Miami

SQL>
  

Кроме того, какова District Manager - цель? Вы хотите также выбрать местоположение из этого? Его нет, поэтому будет возвращен — NULL:

 SQL> with test (col) as
  2    (select 'District Manager - ' from dual)
  3  select trim(substr(col, instr(col, '-')   1)) result
  4  from test;

R
-


SQL>
  

Комментарии:

1. Спасибо. District Manager был написан по ошибке, это должно быть только ‘Manager’. Я отредактировал вопрос. Это сработает в моем случае.

Ответ №3:

И вот версия regex_substr, которая будет выбирать то, что находится после последнего тире / пробела в конце строки:

 SELECT REGEXP_SUBSTR('Manager - Miami', '- (.*)$', 1, 1, NULL, 1) FROM DUAL;