Использование substr для обрезки строки в Oracle

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

Например:

select substr('abc',1,5) from dual;

возвращает 'abc', что мне нужно.

Я хотел бы спросить, безопасно ли это, потому что функция не предназначена для этого использования. Есть ли лучший способ усечения?

Ответ 1

Это полностью нормально, но если вы хотите, вы можете использовать этот запрос:

select substr('abc',1,least(5,length('abc'))) from dual;

Ответ 2

Это интересный вопрос. Удивительно, но документация, похоже, явно не затрагивает этот момент.

Я думаю, что вы делаете вполне безопасно. substr() не будет "добавлять" символы в конец строки, когда строка слишком короткая. Зависит от этого поведения во многих базах данных, включая Oracle, со временем. Вот как аналогичные функции работают в других базах данных и большинстве языков.

Единственное исключение может быть в том случае, если исходным типом данных является тип char(), а не varchar2(). В этом случае функция вернет строку того же типа, поэтому она может быть дополнена пробелами. Тем не менее, это свойство типа, не являющегося функцией.

Ответ 3

Лучше использовать следующий запрос

SELECT SUBSTR('abc',1,LEAST(5,LENGTH('abc'))) FROM DUAL;

Над запросом будет либо длина строки, либо число 5, которое меньше.

Ответ 4

Если вы хотите быть абсолютно уверенным, что в конечном итоге вы не закончите заканчивать пробелы, используя только SUBSTR (вы не будете, но иногда это успокаивает быть действительно уверенным) вы можете использовать:

SELECT RTRIM(SUBSTR('abc',1,5)) FROM DUAL;

Поделитесь и наслаждайтесь.