TRIM: примеры (SQL)
TRIM([ characters FROM ] string): stringБазовая информация о функции TRIM
Функция TRIM в MS SQL Server предназначена для удаления заданных символом или пробелов с начала и/или конца строки. Она появилась в SQL Server 2017, предоставив более гибкую и стандартизированную альтернативу комбинации функций LTRIM и RTRIM.
Функция обычно используется для очистки пользовательского ввода, обработки данных из внешних источников, нормализации строк перед сравнением или вставкой в базу данных.
Синтаксис:TRIM ( [ characters ] FROM string_expression )TRIM ( [ LEADING | TRAILING | BOTH ] [ characters ] FROM string_expression )
Аргументы:
- characters (необязательный): Строковый литерал или переменная, содержащая символы, которые необходимо удалить. Если аргумент не указан, по умолчанию удаляются пробелы (char(32)).
- LEADING | TRAILING | BOTH (необязательный): Уточняющее ключевое слово, определяющее сторону удаления. LEADING удаляет символы только с начала строки, TRAILING — только с конца, BOTH — с обеих сторон (значение по умолчанию).
- string_expression (обязательный): Выражение любого символьного типа (char, nchar, varchar, nvarchar).
Возвращаемое значение: Строка того же типа, что и входной аргумент string_expression, после удаления указанных символов с указанных позиций. Если входной аргумент равен NULL, функция возвращает NULL.
Примеры использования TRIM
Удаление пробелов по умолчанию:
SELECT TRIM(' Пример строки ') AS Result;Result ---------------- Пример строки
Удаление конкретных символов с обеих сторон:
SELECT TRIM('.,! ' FROM '...!!Привет, мир!!...') AS Result;Result ------------- Привет, мир
Удаление символов только с начала строки (LEADING):
SELECT TRIM(LEADING '0' FROM '00001234') AS Result;Result ------ 1234
Удаление символов только с конца строки (TRAILING):
SELECT TRIM(TRAILING 'x' FROM 'testxxx') AS Result;Result ------ test
Работа с NULL:
SELECT TRIM(NULL) AS Result1, TRIM(' ' FROM NULL) AS Result2;Result1 | Result2 --------|-------- NULL | NULL
Похожие функции в MS SQL
LTRIM и RTRIM — это устаревшие, но все еще поддерживаемые функции для удаления пробелов только с левого или только с правого конца строки соответственно. Они не поддерживают удаление произвольных символов, только пробелы.
Сравнение:
TRIM(' test ')эквивалентноLTRIM(RTRIM(' test ')).LTRIM('000123', '0')так сделать нельзя — LTRIM не принимает второй аргумент.
Функцию TRIM предпочтительнее использовать в новых разработках из-за ее соответствия стандарту SQL и большей гибкости. LTRIM/RTRIM можно встретить в унаследованном коде.
Типичные ошибки
1. Неверный порядок ключевых слов. Ключевое слово FROM является обязательным при указании удаляемых символов.
-- Ошибка
SELECT TRIM('ab' 'abctestabc');Сообщение об ошибке: Неверный синтаксис около 'abctestabc'.
-- Правильно
SELECT TRIM('ab' FROM 'abctestabc');2. Попытка удалить NULL. Если аргумент characters явно задан как NULL, это может привести к ошибке или неожиданному результату в зависимости от контекста.
DECLARE @chars NVARCHAR(10) = NULL;
SELECT TRIM(@chars FROM ' test '); -- Вызовет ошибкуСообщение об ошибке: Параметр символов trim должен быть непустой строкой.
3. Ожидание удаления подстроки. Функция удаляет символы из набора, а не подстроку.
SELECT TRIM('test' FROM 'test example test') AS Result;Result ------------------ example
Удаляются символы 't', 'e', 's' с краев, а не строка 'test'.
Изменения в функции
Основное изменение — это само появление функции TRIM в SQL Server 2017 (версия 14.x). До этой версии использовались только LTRIM и RTRIM.
Начиная с SQL Server 2022, в функции не было внесено существенных синтаксических изменений. Однако всегда рекомендуется проверять актуальную документацию для конкретной версии, так как могут добавляться оптимизации или исправляться крайние случаи в поведении.
Расширенные примеры
1. Очистка данных из столбца таблицы.
UPDATE Users
SET LastName = TRIM(' .' FROM LastName)
WHERE LastName LIKE '% .' OR LastName LIKE '.%';2. Комбинирование TRIM с другими строковыми функциями.
SELECT UPPER(TRIM(Username)) AS NormalizedUsername
FROM UserLogins;3. Удаление нескольких различных символов, включая управляющие.
SELECT TRIM(CHAR(9) + CHAR(10) + CHAR(13) + ' ' FROM @DirtyString) AS CleanString;4. Использование в вычисляемом столбце.
ALTER TABLE Products
ADD ProductCode_Clean AS (TRIM(ProductCode));5. Вложенные вызовы TRIM для сложной очистки. Сначала удаляются одни символы, потом другие.
SELECT TRIM('#' FROM TRIM('*' FROM '**#Заголовок#**')) AS Result;Result -------- Заголовок
6. Обработка данных с переносами строк на концах.
SELECT
'[' + TRIM(CHAR(13) + CHAR(10) FROM @TextWithNewLines) + ']' AS Result;7. Использование внутри предложения WHERE для поиска без учета пробелов.
SELECT *
FROM Customers
WHERE TRIM(CustomerName) = 'Иванов';Функции TRIM в других СУБД и языках
MySQL, PostgreSQL: Синтаксис очень похож на стандартный: TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str). Поведение практически идентично MS SQL.
-- PostgreSQL/MySQL
SELECT TRIM(LEADING '.' FROM '..test..');Result: 'test..'
Oracle: Функция TRIM также соответствует стандарту. Дополнительно имеет функции LTRIM и RTRIM, которые, в отличие от MS SQL, могут удалять указанные наборы символов.
-- Oracle
SELECT LTRIM('000123', '0') FROM dual;Result: '123'
SQLite: Функция TRIM существует, но поддерживает только удаление одного указанного символа (или пробела) с обеих сторон. Для удаления набора символов требуется более сложная конструкция.
-- SQLite
SELECT TRIM(' test '); -- Работает
SELECT TRIM('xy', 'xxytestxx'); -- Удалит только символ 'x' с краевВ языках программирования: Аналоги есть практически везде (например, .Trim() в C#, .strip() в Python), но они обычно являются методами строковых объектов, а не глобальными функциями.