Ответ 1
Это полностью нормально, но если вы хотите, вы можете использовать этот запрос:
select substr('abc',1,least(5,length('abc'))) from dual;
Я хочу обрезать строку до указанной длины. Если строка короче, я не хочу ничего делать. Я нашел функцию substr(), которая выполняет задание. Однако в документации Oracle нет ничего, что произойдет, если строка короче, чем максимальная длина.
Например:
select substr('abc',1,5) from dual;
возвращает 'abc', что мне нужно.
Я хотел бы спросить, безопасно ли это, потому что функция не предназначена для этого использования. Есть ли лучший способ усечения?
Это полностью нормально, но если вы хотите, вы можете использовать этот запрос:
select substr('abc',1,least(5,length('abc'))) from dual;
Это интересный вопрос. Удивительно, но документация, похоже, явно не затрагивает этот момент.
Я думаю, что вы делаете вполне безопасно. substr()
не будет "добавлять" символы в конец строки, когда строка слишком короткая. Зависит от этого поведения во многих базах данных, включая Oracle, со временем. Вот как аналогичные функции работают в других базах данных и большинстве языков.
Единственное исключение может быть в том случае, если исходным типом данных является тип char()
, а не varchar2()
. В этом случае функция вернет строку того же типа, поэтому она может быть дополнена пробелами. Тем не менее, это свойство типа, не являющегося функцией.
Лучше использовать следующий запрос
SELECT SUBSTR('abc',1,LEAST(5,LENGTH('abc'))) FROM DUAL;
Над запросом будет либо длина строки, либо число 5, которое меньше.
Если вы хотите быть абсолютно уверенным, что в конечном итоге вы не закончите заканчивать пробелы, используя только SUBSTR (вы не будете, но иногда это успокаивает быть действительно уверенным) вы можете использовать:
SELECT RTRIM(SUBSTR('abc',1,5)) FROM DUAL;
Поделитесь и наслаждайтесь.