LEN: примеры (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 для фильтрации строк:
SELECT ProductName
FROM Products
WHERE LEN(ProductName) > 20
ORDER BY ProductName;Применение в вычисляемом столбце:
ALTER TABLE Customers
ADD ShortName AS LEFT(CustomerName, CASE WHEN LEN(CustomerName) > 10 THEN 10 ELSE LEN(CustomerName) END);Определение средней длины значений в столбце:
SELECT AVG(CAST(LEN(Comments) AS FLOAT)) AS СредняяДлинаКомментариев
FROM Orders
WHERE Comments IS NOT NULL;Использование с функцией REVERSE для проверки симметричности строки:
DECLARE @str NVARCHAR(100) = N'топот';
SELECT CASE WHEN @str = REVERSE(@str) THEN 'Палиндром' ELSE 'Не палиндром' END AS Результат
WHERE LEN(@str) > 1;Поиск записей с минимальной или максимальной длиной в группе:
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;Обрезка строки до определенной длины с добавлением многоточия:
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; -- Возвращает 5Sybase ASE: поддерживает функцию LEN() с похожей логикой, но может иметь особенности с многобайтовыми кодировками.