Преобразование первой буквы в верхний регистр в SQL
Быстрый ответ
Чтобы преобразовать первую букву строки в SQL в заглавную, используя CONCAT
, UPPER
и LOWER
, всего лишь понадобится следующий блок кода:
SELECT CONCAT(UPPER(LEFT(column, 1)), LOWER(SUBSTRING(column, 2))) AS new_column FROM table;
В девственно простом шаблоне произведите замену слова column
на имя вашего столбца и table
на название вашей таблицы. Данный шаблон идеально подходит для любого диалекта SQL и превратит первую букву строки в заглавную, уставив себе рамки в виде всех остальных букв в нижнем регистре.
Продвинутая обработка специальных символов
В программировании нередко приходится сталкиваться с такими великолепными особенностями как дефисы и различные специальные символы. Например, имена, подчеркнутые дефисом, а ля 'Smith-Jones', или название заведения, такие как 'McDonalds'. Для их аккуратной обработки воспользуйтесь следующим усовершенствованным решением:
SELECT STRING_AGG(
CASE
WHEN part = '' THEN ''
ELSE CONCAT(UPPER(LEFT(part, 1)), LOWER(SUBSTRING(part, 2)))
END,
'-'
) AS new_column
FROM
(SELECT UNNEST(STRING_TO_ARRAY(column, '-')) AS part FROM table) AS sub;
Чудесное сочетание методов STRING_TO_ARRAY
и UNNEST
позволит вам аккуратно обработать строки, содержащие дефис, и привести их к великолепному виду.
Собственная функция: Особый шарм вашего SQL
Чтобы сгладить всю шершавость в работе со многообразием стилистических правил и капитализировать первую букву каждого слова в строке, вы можете воспользоваться декларацией собственной функции.
CREATE FUNCTION CapitalizeFirstLetter(@InputString VARCHAR(255))
RETURNS VARCHAR(255)
AS
BEGIN
DECLARE @Index INT
SET @Index = 1
WHILE @Index <= LEN(@InputString)
BEGIN
IF @Index = 1 OR SUBSTRING(@InputString, @Index – 1, 1) = ' ' OR SUBSTRING(@InputString, @Index – 1, 1) = '-'
BEGIN
SET @InputString = STUFF(@InputString, @Index, 1, UPPER(SUBSTRING(@InputString, @Index, 1)))
END
SET @Index = @Index + 1
END
SET @InputString = LOWER(@InputString)
SET @Index = 1
WHILE @Index <= LEN(@InputString)
BEGIN
IF @Index = 1 OR SUBSTRING(@InputString, @Index – 1, 1) IN (' ', '-')
BEGIN
SET @InputString = STUFF(@InputString, @Index, 1, UPPER(SUBSTRING(@InputString, @Index, 1)))
END
SET @Index = @Index + 1
END
RETURN @InputString
END
А используете вы её так:
UPDATE table SET column = dbo.CapitalizeFirstLetter(column);
Пожалуйста, убедитесь, что ваша спроектированная функция доступна в области видимости вашей базы данных с префиксом dbo
или соответствующим допустимым пространством имен schema
.
Визуализация
Представьте себе образно, что каждому слову из вашего списка требуется подобрать наряд для премьеры оперы. Ваша задача как SQL-маэстро — подобрать каждому слову галстук и золотые запонки.
Sentence: [john, DOE, alice, Smith]
Каждому слову следует «приодеть» — сделать первую букву заглавной:
SELECT CONCAT(UPPER(SUBSTRING(name, 1, 1)), LOWER(SUBSTRING(name, 2))) FROM opera_guests;
И вот момент торжества — все выглядят нарядно:
Гости в штатской одежде: [John, Doe, Alice, Smith]
И мы можем тройкой мчаться на бал. 🎩👒
Дополнительные инструменты: XML и узлы
Для сложных строковых манипуляций, когда требуется обработать сразу несколько слов, использование XML и узлов может заметно упростить процесс в SQL:
SELECT (
SELECT ' ' + UPPER(LEFT(T.value, 1)) + LOWER(SUBSTRING(T.value, 2, LEN(T.value)))
FROM (
SELECT CAST ('<M>' + REPLACE(REPLACE(column, '-', ' '), ' ', '</M><M>') + '</M>' AS XML) AS String
) AS A CROSS APPLY String.nodes ('/M') AS String(T)
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)') as new_column
FROM table;
Данное решение с использованием XML и узлов предоставляет мощный инструментарий для изящного преобразования строк.
Динамический SQL на выручку
При работе с динамично изменяющимися схемами или таблицами динамический SQL станет вашим верным союзником:
DECLARE @DynamicSQL NVARCHAR(MAX)
SET @DynamicSQL = 'SELECT CONCAT(UPPER(LEFT(' + @ColumnName + ', 1)), LOWER(SUBSTRING(' + @ColumnName + ', 2))) AS new_column FROM ' + @TableName
EXEC sp_executesql @DynamicSQL
Только не забывайте о безопасности — предотвращение SQL-инъекций требует особого внимания и очистки динамических элементов или использования предварительно проверенных значений.
Держите ошибки под контролем
Реализация проверок на ошибки поможет справиться с неочевидными данными. Иногда SQL может попытаться привести к верхнему регистру числа или специальные символы.
IF NOT EXISTS(SELECT * FROM table WHERE ISNUMERIC(column) = 1)
BEGIN
-- Проверка была успешной, можно выполнять действия.
END
ELSE
BEGIN
RAISERROR('Столбец содержит не только буквы.', 16, 1) -- SQL реагирует при детекте ошибки
END
Такой подход позволит избежать случайной капитализации чисел и сохранит данные в совершенной целостности.
Справляемся с чудовищем массовых данных
Когда дело доходит до очень больших объемов данных, стоит задуматься о масштабируемости. При работе с большими таблицы может быть целесообразно выполнять операции по частям или использовать SQL CLR функции для обеспечения нужной производительности.
Полезные материалы
- Документация PostgreSQL по функциям работы со строками — всё, что нужно знать о строковых операциях в PostgreSQL.
- Руководство MySQL по функциям и операторам для работы со строками — проработанное описание функций MySQL для преобразования регистра букв.
- Функции работы со строками в SQL Server (Transact-SQL) — официальное руководство Microsoft по строковым функциям T-SQL.
- Описание функции INITCAP в Oracle Database — как использовать функцию INITCAP в Oracle для капитализации слов.
- Встроенные функции SQLite — общий обзор скалярных и строковых функций SQLite.
- SQL Style Guide от Simon Holywell — насыщенное ведомственное руководство для эталонного написания грамотного и понятного SQL-кода.