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

Работа с функцией LEN в T-SQL: синтаксис и практика
Раздел: Строковые функции, Строковые
LENGTH(string): int

Описание функции LEN в MS SQL

В Microsoft SQL Server для определения длины символьной строки используется функция LEN. Несмотря на то, что в других СУБД аналогичная функция часто называется LENGTH, в T-SQL используется именно LEN. Она возвращает количество символов в заданном строковом выражении, исключая замыкающие пробелы (пробелы в конце строки).

Функция обычно применяется для валидации данных, обрезки строк, анализа текстовых полей или в условиях выборки данных.

Синтаксис:
LEN ( string_expression )

Аргументы:

  • string_expression — строковое выражение, для которого вычисляется длина. Может быть константой, переменной или столбцом символьного или бинарного типа данных.

Возвращаемое значение:

  • Тип данных int. Функция возвращает количество символов в строке. Если входное выражение имеет тип varchar(max), nvarchar(max) или varbinary(max), возвращаемый тип — bigint.
  • Если аргумент равен NULL, функция возвращает NULL.
  • Важно: LEN не включает замыкающие пробелы в расчет длины. Для учета всех пробелов используется функция DATALENGTH.

Простые примеры использования

Базовые примеры демонстрируют работу функции LEN с различными входными данными.

SELECT LEN('Привет') AS Length1;
Length1
6
SELECT LEN('SQL Server  ') AS Length2; -- Строка с двумя замыкающими пробелами
Length2
10
SELECT LEN(N'Unicode текст') AS Length3; -- Строка в кодировке Unicode
Length3
12
SELECT LEN('') AS Length4, LEN(' ') AS Length5; -- Пустая строка и строка из одного пробела
Length4 Length5
0       0
SELECT LEN(NULL) AS Length6;
Length6
NULL

Похожие функции в MS SQL

В T-SQL существуют другие функции для работы с длиной данных.

  • DATALENGTH(expression) — возвращает количество байтов, используемых для представления выражения. Учитывает все пробелы, включая замыкающие, и зависит от кодировки. Для строки 'абвг' типа varchar DATALENGTH вернет 4, а для типа nvarchar — 8.
  • LEN предпочтительнее для логической работы с длиной текста, когда пробелы в конце не имеют значения (например, длина имени). DATALENGTH используется для точного подсчета занимаемой памяти, что важно для бинарных данных или при анализе хранимых объемов.

Типичные ошибки

Частые ошибки связаны с непониманием обработки пробелов и типов данных.

1. Неучет замыкающих пробелов. Ожидание, что LEN('текст ') вернет 7 вместо 6.

SELECT LEN('Ошибка   ') AS ActualLength;
ActualLength
6

2. Путаница между LEN и DATALENGTH для Unicode. Для строки N'й' (кириллическая буква) LEN вернет 1, а DATALENGTH — 2 байта.

SELECT LEN(N'й') AS LenResult, DATALENGTH(N'й') AS DataLengthResult;
LenResult DataLengthResult
1         2

3. Использование с числовыми типами. Функция требует явного преобразования числа в строку.

-- Неверно
SELECT LEN(12345); -- Ошибка преобразования типов данных
-- Верно
SELECT LEN(CAST(12345 AS VARCHAR(10)));

Изменения в последних версиях

Функция LEN не претерпела значительных изменений в последних версиях SQL Server. Важное уточнение: начиная с SQL Server 2012, для типов данных с суффиксом max (varchar(max), nvarchar(max), varbinary(max)) возвращаемым типом значения является bigint, что позволяет корректно работать с длинами, превышающими 2^31-1 символов. В более ранних версиях возвращался тип int.

Расширенные примеры

Примеры демонстрируют применение LEN в реальных сценариях.

Пример 1: Поиск записей с длиной строки в определенном диапазоне.

Пример sql
SELECT ProductName 
FROM Products 
WHERE LEN(ProductName) BETWEEN 5 AND 10;

Пример 2: Обрезка строки до заданной длины с добавлением многоточия.

Пример sql
DECLARE @text NVARCHAR(100) = 'Очень длинный текст, который нужно сократить';
SELECT CASE 
           WHEN LEN(@text) > 20 THEN LEFT(@text, 17) + '...'
           ELSE @text 
       END AS ShortText;
ShortText
Очень длинный текст...

Пример 3: Анализ распределения длин строк в столбце.

Пример sql
SELECT 
    LEN(LastName) AS NameLength,
    COUNT(*) AS Count
FROM Persons
GROUP BY LEN(LastName)
ORDER BY NameLength;

Пример 4: Использование в комбинации с другими строковыми функциями.

Пример sql
SELECT 
    REVERSE(Username) AS ReversedName,
    LEN(Username) AS OriginalLength,
    LEN(REVERSE(Username)) AS ReversedLength -- Длина остается той же
FROM Users;

Пример 5: Обработка строк с ведущими и замыкающими пробелами. LEN игнорирует только замыкающие пробелы.

Пример sql
SELECT 
    LEN('  текст  ') AS LenResult, -- 8 символов (2 ведущих пробела + 6 букв)
    DATALENGTH('  текст  ') AS DataLenResult; -- 10 байт для varchar (учитываются все 10 символов, включая пробелы)
LenResult DataLenResult
8         10

Аналоги функции в других СУБД и языках

В других системах управления базами данных существуют аналогичные функции с нюансами.

MySQL, SQLite, Sybase ASE: Функция CHAR_LENGTH() или CHARACTER_LENGTH() возвращает количество символов. LENGTH() возвращает длину в байтах, что зависит от кодировки.

-- MySQL
SELECT CHAR_LENGTH('текст'), LENGTH('текст'); -- В UTF-8: 5 символов, 10 байт
5, 10

Oracle, PostgreSQL: Функция LENGTH() возвращает количество символов. Для байтовой длины используется LENGTHB() в Oracle и OCTET_LENGTH() в PostgreSQL.

-- PostgreSQL
SELECT LENGTH('пример'), OCTET_LENGTH('пример'); -- В UTF-8: 6 символов, 12 байт
6, 12

Python: len() возвращает количество элементов в последовательности. Для строк — количество символов.

len("строка")  # 6

MS SQL LENGTH function comments

En
LENGTH Returns the length of a string in bytes or characters