TRIM: примеры (SQL)

Использование функции TRIM для обработки строк в SQL Server
Раздел: Строковые функции, Строковые
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. Очистка данных из столбца таблицы.

Пример sql
UPDATE Users
SET LastName = TRIM(' .' FROM LastName)
WHERE LastName LIKE '% .' OR LastName LIKE '.%';

2. Комбинирование TRIM с другими строковыми функциями.

Пример sql
SELECT UPPER(TRIM(Username)) AS NormalizedUsername
FROM UserLogins;

3. Удаление нескольких различных символов, включая управляющие.

Пример sql
SELECT TRIM(CHAR(9) + CHAR(10) + CHAR(13) + ' ' FROM @DirtyString) AS CleanString;

4. Использование в вычисляемом столбце.

Пример sql
ALTER TABLE Products
ADD ProductCode_Clean AS (TRIM(ProductCode));

5. Вложенные вызовы TRIM для сложной очистки. Сначала удаляются одни символы, потом другие.

Пример sql
SELECT TRIM('#' FROM TRIM('*' FROM '**#Заголовок#**')) AS Result;
Result
--------
Заголовок

6. Обработка данных с переносами строк на концах.

Пример sql
SELECT 
    '[' + TRIM(CHAR(13) + CHAR(10) FROM @TextWithNewLines) + ']' AS Result;

7. Использование внутри предложения WHERE для поиска без учета пробелов.

Пример sql
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), но они обычно являются методами строковых объектов, а не глобальными функциями.

MS SQL TRIM function comments

En
TRIM Removes the space character or other specified characters from the start and end of a string