Капитализация первой буквы строки SQL: оптимальное решение

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Сделаем первую букву каждого слова прописной при помощи функций STRING_AGG и STRING_SPLIT.

SQL
Скопировать код
WITH SplitWords AS (
    SELECT UPPER(SUBSTRING(value, 1, 1)) + LOWER(SUBSTRING(value, 2, LEN(value))) AS CapitalizedWord
    FROM STRING_SPLIT('ваша исходная строка', ' ')
)
SELECT STRING_AGG(CapitalizedWord, ' ') FROM SplitWords;

Этот запрос разделяет строку на слова, делает первую букву каждого слова прописной, а затем соединяет слова обратно в строку. Однако, существуют и более сложные сценарии, которые мы также рассмотрим, учитывая особенности работы с большими наборами данных и версионные ограничения SQL Server.

Решаем специальные требования и учитываем особенности

Объем данных: Обработка больших наборов

При работе с большими наборами данных важно использовать массовые операции для повышения производительности. Применяем рекурсивные Общие Табличные Выражения (CTE), избегая снижения производительности из-за использования циклов и курсоров.

SQL
Скопировать код
WITH SplitWords (word, rest_of_string) AS (
    SELECT 
        CAST(SUBSTRING(your_string, 1, CHARINDEX(' ', your_string + ' ') – 1) AS VARCHAR(MAX)),
        STUFF(your_string, 1, CHARINDEX(' ', your_string + ' '), '')
    FROM (SELECT 'ваша исходная строка' AS your_string) AS string_to_split
    UNION ALL
    SELECT 
        CAST(SUBSTRING(rest_of_string, 1, CHARINDEX(' ', rest_of_string + ' ') – 1) AS VARCHAR(MAX)),
        STUFF(rest_of_string, 1, CHARINDEX(' ', rest_of_string + ' '), '')
    FROM SplitWords
    WHERE rest_of_string <> ''
),
CapitalizedWords AS (
    SELECT 
        UPPER(SUBSTRING(word, 1, 1)) + LOWER(SUBSTRING(word, 2, LEN(word))) AS CapitalizedWord 
    FROM SplitWords
)
SELECT STRING_AGG(CapitalizedWord, ' ') FROM CapitalizedWords;

Версионные особенности: Обработка версионных ограничений

В зависимости от версии, SQL Server предоставляет различные функции. Например, STRING_SPLIT доступна только начиная с версии 2016. В предыдущих версиях можно использовать другие методы, вроде пользовательских функций или сочетаний CHARINDEX и SUBSTRING.

Специфический случаи: Специальные символы

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

SQL
Скопировать код
WITH SplitWords AS (
    SELECT value, CHARINDEX(value, 'ваша-исходная-строка') AS Pos
    FROM STRING_SPLIT('ваша-исходная-строка', ' ')
    WHERE value LIKE '[A-Za-z]%'
),
CapitalizedWords AS (
    SELECT 
        STUFF(value, 1, 1, UPPER(SUBSTRING(value, 1, 1))) AS CapitalizedWord, Pos
    FROM SplitWords
)
SELECT STUFF((
    SELECT '' + CapitalizedWord 
    FROM CapitalizedWords 
    ORDER BY Pos 
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 0, '') AS TitleCase;

Реализация повторно используемой пользовательской функции

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

Для упрощения повторного использования можно оформить логику в пользовательскую функцию (UDF):

SQL
Скопировать код
CREATE FUNCTION dbo.CapitalizeFirstLetter(@InputString VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN
    RETURN (SELECT STRING_AGG(UPPER(SUBSTRING(value, 1, 1)) + LOWER(SUBSTRING(value, 2, LEN(value))), ' ') 
            FROM STRING_SPLIT(@InputString, ' '));
END
GO

Вызов функции:

SQL
Скопировать код
SELECT dbo.CapitalizeFirstLetter('ваша исходная строка');

Полезные материалы

  1. FORMAT (Transact-SQL) – SQL Server | Microsoft Learn – подробнее о функции FORMAT для форматирования строк.
  2. STUFF (Transact-SQL) – SQL Server | Microsoft Learn – техники работы со строками пользоватую STUFF.
  3. UPPER (Transact-SQL) – SQL Server | Microsoft Learn – преобразование текста в верхний регистр с помощью UPPER.
  4. CHARINDEX (Transact-SQL) – SQL Server | Microsoft Learn – поиск символов в строках с CHARINDEX.
  5. PATINDEX (Transact-SQL) – SQL Server | Microsoft Learn – возможности PATINDEX для поиска соответствия шаблонам.
  6. Рекурсивные запросы с использованием WITH для операций со строками – более глубокое понимание рекурсивных запросов с использованием WITH, полезных для сложных операций со строками.