LENGTH: примеры (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; -- Строка в кодировке UnicodeLength3 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) — возвращает количество байтов, используемых для представления выражения. Учитывает все пробелы, включая замыкающие, и зависит от кодировки. Для строки 'абвг' типа
varcharDATALENGTH вернет 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: Поиск записей с длиной строки в определенном диапазоне.
SELECT ProductName
FROM Products
WHERE LEN(ProductName) BETWEEN 5 AND 10;Пример 2: Обрезка строки до заданной длины с добавлением многоточия.
DECLARE @text NVARCHAR(100) = 'Очень длинный текст, который нужно сократить';
SELECT CASE
WHEN LEN(@text) > 20 THEN LEFT(@text, 17) + '...'
ELSE @text
END AS ShortText;ShortText Очень длинный текст...
Пример 3: Анализ распределения длин строк в столбце.
SELECT
LEN(LastName) AS NameLength,
COUNT(*) AS Count
FROM Persons
GROUP BY LEN(LastName)
ORDER BY NameLength;Пример 4: Использование в комбинации с другими строковыми функциями.
SELECT
REVERSE(Username) AS ReversedName,
LEN(Username) AS OriginalLength,
LEN(REVERSE(Username)) AS ReversedLength -- Длина остается той же
FROM Users;Пример 5: Обработка строк с ведущими и замыкающими пробелами. LEN игнорирует только замыкающие пробелы.
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