获取SQL字符串中每个单词的第一个字母

时间:2012-02-15 20:46:08

标签: sql sql-server string function get

  

可能重复:
  sql to pick apart a string of a persons name and output the initials

MS-SQL Server中,有一种方法可以获得字符串中每个单词的第一个字母吗?例如:

姓名:

  迈克尔约瑟夫杰克逊

查询:

SELECT name, [function] as initial FROM Customers

结果:

  

MJJ

5 个答案:

答案 0 :(得分:31)

此函数将屏蔽您的结果与源字符串中的多个连续空格:

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

答案 1 :(得分:3)

您需要在更新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');

答案 2 :(得分:2)

假设我们在MSSQL2008R2中这样做,虽然没有任何参与在这里真的很重要。我们所做的就是通过字符串操作获得一些乐趣。您可以将它放入函数或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

如果你不是为了一些微不足道的目的而做这件事,你可能想要在尝试处理之前清理数据。名称通常以标题为前缀,数据输入字段容易出现用户错误等。

答案 3 :(得分:0)

首先需要一个表值函数,它分割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'。

答案 4 :(得分:-2)

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