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

Использование функции LEN для определения длины строки в MS SQL
Раздел: Строковые функции, Строковые
LEN(string_expression): int

Функция LEN в MS SQL Server

Функция LEN в Microsoft SQL Server предназначена для определения количества символов в строковом выражении. Она широко применяется для валидации данных, обрезки строк до определенного размера или анализа текстовой информации в запросах, хранимых процедурах и скриптах.

Синтаксис функции:

LEN ( string_expression )

Аргумент string_expression представляет собой строковое выражение, для которого требуется вычислить длину. Допускается использование данных типов char, varchar, nchar, nvarchar, binary или varbinary.

Возвращаемое значение имеет тип bigint, если аргумент имеет типы varchar(max), nvarchar(max) или varbinary(max). В остальных случаях возвращается тип int. Функция не учитывает завершающие пробелы в строке. Для данных типа binary возвращается длина бинарной строки.

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

Определение длины обычной строки:

SELECT LEN('Пример текста') AS ДлинаСтроки;
ДлинаСтроки
-------------
12

Использование с данными типа nvarchar:

SELECT LEN(N'Unicode текст') AS ДлинаЮникод;
ДлинаЮникод
-------------
12

Демонстрация игнорирования завершающих пробелов:

SELECT 
    LEN('Текст с пробелами   ') AS БезПробелов,
    DATALENGTH('Текст с пробелами   ') AS ВсеСимволы;
БезПробелов ВсеСимволы
----------- -----------
18          23

Работа с пустой строкой и NULL:

SELECT 
    LEN('') AS ПустаяСтрока,
    LEN(NULL) AS ЗначениеNULL;
ПустаяСтрока ЗначениеNULL
------------ ------------
0            NULL

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

DATALENGTH возвращает количество байт, используемых для представления выражения. В отличие от LEN, учитывает завершающие пробелы и работает с любыми типами данных. Полезна для анализа фактического занимаемого места.

LEN предпочтительнее для логической длины строки, а DATALENGTH для анализа размера хранения.

Функция CHAR_LENGTH является синонимом LEN в некоторых контекстах для совместимости со стандартом SQL.

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

Основная ошибка - ожидание учета завершающих пробелов. Функция LEN их обрезает.

-- Неожиданный результат для пользователя
SELECT LEN('А   ') AS Результат; -- Вернет 1, а не 4

Передача аргумента нестрокового типа может привести к неявному преобразованию или ошибке.

SELECT LEN(12345); -- Неявное преобразование в '12345', вернет 5
SELECT LEN(GETDATE()); -- Преобразование даты в строку, длина зависит от формата

Использование с NULL всегда возвращает NULL, что может нарушить логику вычислений.

SELECT LEN(NULL) + 5; -- Результат NULL

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

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

Для обеспечения обратной совместимости, при использовании в контексте более ранних версий SQL Server, возвращаемый тип остается int.

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

Использование в условии WHERE для фильтрации строк:

Пример sql
SELECT ProductName 
FROM Products 
WHERE LEN(ProductName) > 20 
ORDER BY ProductName;

Применение в вычисляемом столбце:

Пример sql
ALTER TABLE Customers
ADD ShortName AS LEFT(CustomerName, CASE WHEN LEN(CustomerName) > 10 THEN 10 ELSE LEN(CustomerName) END);

Определение средней длины значений в столбце:

Пример sql
SELECT AVG(CAST(LEN(Comments) AS FLOAT)) AS СредняяДлинаКомментариев
FROM Orders
WHERE Comments IS NOT NULL;

Использование с функцией REVERSE для проверки симметричности строки:

Пример sql
DECLARE @str NVARCHAR(100) = N'топот';
SELECT CASE WHEN @str = REVERSE(@str) THEN 'Палиндром' ELSE 'Не палиндром' END AS Результат
WHERE LEN(@str) > 1;

Поиск записей с минимальной или максимальной длиной в группе:

Пример sql
WITH Lengths AS (
    SELECT ProductID, ProductName, LEN(ProductName) AS NameLength,
           ROW_NUMBER() OVER (ORDER BY LEN(ProductName)) AS MinRow,
           ROW_NUMBER() OVER (ORDER BY LEN(ProductName) DESC) AS MaxRow
    FROM Products
)
SELECT ProductID, ProductName, NameLength, 
       CASE WHEN MinRow = 1 THEN 'Минимальная длина' 
            WHEN MaxRow = 1 THEN 'Максимальная длина' 
            ELSE '' END AS Примечание
FROM Lengths
WHERE MinRow = 1 OR MaxRow = 1;

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

Пример sql
DECLARE @text NVARCHAR(MAX) = N'Очень длинный текст, который нужно сократить для предварительного просмотра.';
DECLARE @maxLen INT = 30;

SELECT CASE 
    WHEN LEN(@text) <= @maxLen THEN @text
    ELSE LEFT(@text, @maxLen - 3) + '...'
END AS СокращенныйТекст;

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

MySQL, PostgreSQL, SQLite: функция CHAR_LENGTH() или LENGTH(). В MySQL LENGTH() возвращает длину в байтах, а CHAR_LENGTH() в символах.

-- PostgreSQL
SELECT CHAR_LENGTH('Пример'); -- Возвращает 6

-- MySQL
SELECT LENGTH('Пример'); -- Может вернуть 12 байт для UTF-8
SELECT CHAR_LENGTH('Пример'); -- Вернет 6 символов

Oracle: функция LENGTH() работает аналогично, также есть LENGTHB() для длины в байтах.

SELECT LENGTH('Текст') FROM dual; -- Возвращает 5

Sybase ASE: поддерживает функцию LEN() с похожей логикой, но может иметь особенности с многобайтовыми кодировками.

MS SQL LEN function comments

En
LEN Returns the number of characters of the specified string expression, excluding trailing blanks