Получить первую букву каждого слова в строке SQL
Возможный дубликат:
sql, чтобы выделить строку имени человека и вывести инициалы
В MS-SQL Server
есть способ получить первую букву каждого слова в строке? Например:
Название:
Майкл Джозеф Джексон
Запрос:
SELECT name, [function] as initial FROM Customers
Результат:
MJJ
6 ответов
Эта функция защитит ваши результаты от нескольких последовательных пробелов в исходной строке:
CREATE FUNCTION dbo.fnFirsties ( @str NVARCHAR(4000) )
RETURNS NVARCHAR(2000)
AS
BEGIN
DECLARE @retval NVARCHAR(2000);
SET @str=RTRIM(LTRIM(@str));
SET @retval=LEFT(@str,1);
WHILE CHARINDEX(' ',@str,1)>0 BEGIN
SET @str=LTRIM(RIGHT(@str,LEN(@str)-CHARINDEX(' ',@str,1)));
SET @retval+=LEFT(@str,1);
END
RETURN @retval;
END
GO
SELECT dbo.fnFirsties('Michael Joseph Jackson');
SELECT dbo.fnFirsties(' Michael Joseph Jackson '); -- multiple space protection :)
Результаты:
MJJ
MJJ
Предполагая, что мы делаем это в MSSQL2008R2, хотя здесь ничего не должно значить. Все, что мы делаем, это развлекаемся со строковыми манипуляциями. Вы можете поместить это в funciton или proc или просто запустить в анализаторе запросов напрямую.
DECLARE @str varchar(250) = 'Michael Joseph Jackson'
DECLARE @initials varchar(250) = substring(@str,1,1)
WHILE(charindex(' ',@str)!=0)
BEGIN
DECLARE @currentSpace int = charindex(' ',@str)
SET @initials += substring(@str,@currentSpace+1,1)
SET @str = substring(@str,@currentSpace+1,len(@str))
END
SELECT @initials
Если вы делаете это не для какой-то тривиальной цели, вам, вероятно, захочется очистить данные перед попыткой их обработки. Имена часто начинаются с префиксов заголовков, поля ввода данных подвержены ошибкам пользователя и т. Д.
Вы захотите добавить некоторые проверки и обработку ошибок, прежде чем обновлять tblStudents или что-то еще, но это должно помочь вам начать.
CREATE FUNCTION initials ( @s AS nvarchar(4000))
RETURNS nvarchar(100)
AS
BEGIN
DECLARE @i nvarchar(100) = LEFT(@s, 1); -- first char in string
DECLARE @p int = CHARINDEX(' ', @s); -- location of first space
WHILE (@p > 0) -- while a space has been found
BEGIN
SET @i = @i + SUBSTRING(@s, @p + 1, 1) -- add char after space
SET @p = CHARINDEX(' ', @s, @p + 1); -- find next space
END
RETURN @i
END
GO
SELECT dbo.initials('Michael Joseph Jackson');
Сначала вам понадобится табличная функция, которая разбивает varchar
и возвращает таблицу с одним столбцом под названием "S".
CREATE FUNCTION dbo.fn_Split2 (@sep nvarchar(10), @s nvarchar(4000))
RETURNS table
AS
RETURN (
WITH Pieces(pn, start, stop) AS (
SELECT 1, 1, CHARINDEX(@sep, @s)
UNION ALL
SELECT pn + 1, stop + (datalength(@sep)/2), CHARINDEX(@sep, @s, stop + (datalength(@sep)/2))
FROM Pieces
WHERE stop > 0
)
SELECT pn,
SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 4000 END) AS s
FROM Pieces
)
Получить инициалы теперь легко:
DECLARE @Initials VARCHAR(8000)
SELECT @Initials = COALESCE(@Initials, '') + SUBSTRING(s, 1, 1) FROM dbo.fn_Split2(' ', 'Michael Joseph Jackson')
SELECT @Initials
Это возвращает "MJJ", как требуется.
Возможно, вам придется использовать UDF: пользовательская функция