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

Работа с функцией LEFT для выборки начальных символов строки в MS SQL
Раздел: Строковые функции, Строковые
LEFT(character_expression, integer_expression): varchar

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

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

Синтаксис функции имеет следующий вид: LEFT ( character_expression , integer_expression ).

  • character_expression: исходное строковое выражение. Может быть константой, переменной или столбцом символьного или двоичного типа данных. Типы данных text, ntext и image не поддерживаются, их необходимо явно преобразовывать в varchar(max) или nvarchar(max).
  • integer_expression: положительное целое число, определяющее количество возвращаемых символов. Если значение является типом bigint или отрицательным числом, возникает ошибка. Если аргумент превышает длину строки, функция возвращает всю исходную строку. Если аргумент равен нулю, возвращается пустая строка.

Возвращаемый тип данных соответствует типу аргумента character_expression. Для входных данных типа varchar возвращается varchar, для nvarchar – nvarchar, а для varbinary – varbinary.

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

Ниже приведены базовые примеры применения функции LEFT с разными параметрами.

Пример 1: Извлечение первых символов строки

SELECT LEFT('Microsoft SQL Server', 9) AS Result;
Result
-----------
Microsoft

Пример 2: Аргумент больше длины строки

SELECT LEFT('SQL', 10) AS Result;
Result
-----------
SQL

Пример 3: Использование с целым числом ноль

SELECT LEFT('Пример текста', 0) AS Result;
Result
-----------

Пример 4: Работа с данными столбца таблицы

CREATE TABLE #Products (ProductCode VARCHAR(10));
INSERT INTO #Products VALUES ('ABCD12345'), ('XYZ987');
SELECT ProductCode, LEFT(ProductCode, 4) AS ProductPrefix FROM #Products;
DROP TABLE #Products;
ProductCode ProductPrefix
----------- --------------
ABCD12345   ABCD
XYZ987      XYZ9

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

В SQL Server доступны другие строковые функции для работы с частями строки:

  • RIGHT(character_expression, integer_expression): извлекает указанное количество символов с конца строки. Применяется аналогично LEFT, но для суффиксов.
  • SUBSTRING(expression, start, length): возвращает подстроку из строки, начиная с заданной позиции и указанной длины. Более универсальна, так как позволяет извлекать подстроку из любой части строки.
  • CHARINDEX(substring, string [, start_location]): находит начальную позицию подстроки в строке. Часто используется совместно с SUBSTRING для извлечения текста между определенными символами.

Функцию LEFT предпочтительнее использовать, когда нужно получить именно начало строки, так как ее синтаксис проще и нагляднее. SUBSTRING применяется в более сложных случаях, когда позиция извлечения не фиксирована или вычисляется динамически.

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

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

MySQL:

SELECT LEFT('Пример строки', 7);
Результат: 'Пример'

PostgreSQL:

SELECT LEFT('Пример строки', 7);
Результат: 'Пример'

В PostgreSQL также доступна функция SUBSTRING с аналогичным поведением.

Oracle:

В Oracle отсутствует встроенная функция LEFT. Вместо нее используется SUBSTR.

SELECT SUBSTR('Пример строки', 1, 7) FROM dual;
Результат: 'Пример'

SQLite:

SQLite также не имеет функции LEFT. Используется SUBSTR.

SELECT SUBSTR('Пример строки', 1, 7);
Результат: 'Пример'

Python (в контексте обработки строк):

text = "Пример строки"
result = text[:7]
print(result)
'Пример'

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

При работе с функцией LEFT могут возникать следующие ошибки.

Ошибка 1: Отрицательное значение второго аргумента

SELECT LEFT('Test', -1);
Сообщение об ошибке: "The second argument of the LEFT function must be a positive integer."

Ошибка 2: Использование нецелочисленного типа

SELECT LEFT('Test', 3.7);
Функция работает, но происходит неявное преобразование числа с плавающей точкой к целому (усечение до 3). Лучше использовать явное приведение.

Ошибка 3: Передача значения NULL

SELECT LEFT(NULL, 5) AS Result1, LEFT('Text', NULL) AS Result2;
Result1 Result2
------- -------
NULL    NULL

При любом NULL аргументе функция возвращает NULL.

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

В последних версиях Microsoft SQL Server (начиная с SQL Server 2012) функция LEFT не претерпела значительных изменений в поведении или синтаксисе. Основные улучшения связаны с оптимизацией производительности в рамках общего развития ядра СУБД. В SQL Server 2017 и более поздних версиях функция корректно работает с данными в кодировке UTF-8 при использовании соответствующих параметров сортировки.

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

Пример 1: Динамическое определение длины префикса

Пример sql
DECLARE @text NVARCHAR(100) = 'Главный офис: Москва';
DECLARE @delimiter CHAR(1) = ':';
SELECT LEFT(@text, CHARINDEX(@delimiter, @text) - 1) AS Location;
Location
-----------
Главный офис

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

Пример sql
SELECT 
    Email,
    LEFT(Email, CHARINDEX('@', Email) - 1) AS UserName
FROM (VALUES ('user@example.com'), ('admin@test.ru')) AS T(Email);
Email             UserName
---------------- ---------
user@example.com user
admin@test.ru    admin

Пример 3: Обработка данных с фиксированной длиной поля

Пример sql
SELECT 
    Code,
    LEFT(Code + '00000', 5) AS NormalizedCode
FROM (VALUES ('A1'), ('BC23'), ('DEF')) AS Codes(Code);
Code NormalizedCode
---- ---------------
A1   A1000
BC23 BC230
DEF  DEF00

Пример 4: Рекурсивное использование в CTE

Пример sql
WITH SplitWords AS (
    SELECT 'Один,Два,Три' AS Str, 1 AS Pos
    UNION ALL
    SELECT 
        SUBSTRING(Str, CHARINDEX(',', Str) + 1, LEN(Str)),
        Pos + 1
    FROM SplitWords
    WHERE CHARINDEX(',', Str) > 0
)
SELECT Pos, LEFT(Str, CASE WHEN CHARINDEX(',', Str) > 0 THEN CHARINDEX(',', Str) - 1 ELSE LEN(Str) END) AS Word
FROM SplitWords;
Pos Word
--- ----
1   Один
2   Два
3   Три

MS SQL LEFT function comments

En
LEFT Returns the left part of a character string with the specified number of characters