Получить первую букву каждого слова в строке 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: пользовательская функция

SUBSTRING( string, startpos, endpos) AS 'Initial'

Другие вопросы по тегам