Капитализация первой буквы строки SQL: оптимальное решение
Быстрый ответ
Сделаем первую букву каждого слова прописной при помощи функций STRING_AGG
и STRING_SPLIT
.
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), избегая снижения производительности из-за использования циклов и курсоров.
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
.
Специфический случаи: Специальные символы
Если в ваших строках присутствуют специальные символы, решение должно быть в состоянии корректно преобразовывать в прописные буквы, следующие за любыми символами, отличными от букв и цифр.
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):
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
Вызов функции:
SELECT dbo.CapitalizeFirstLetter('ваша исходная строка');
Полезные материалы
- FORMAT (Transact-SQL) – SQL Server | Microsoft Learn – подробнее о функции
FORMAT
для форматирования строк. - STUFF (Transact-SQL) – SQL Server | Microsoft Learn – техники работы со строками пользоватую
STUFF
. - UPPER (Transact-SQL) – SQL Server | Microsoft Learn – преобразование текста в верхний регистр с помощью
UPPER
. - CHARINDEX (Transact-SQL) – SQL Server | Microsoft Learn – поиск символов в строках с
CHARINDEX
. - PATINDEX (Transact-SQL) – SQL Server | Microsoft Learn – возможности
PATINDEX
для поиска соответствия шаблонам. - Рекурсивные запросы с использованием WITH для операций со строками – более глубокое понимание рекурсивных запросов с использованием
WITH
, полезных для сложных операций со строками.