可能重复:
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
答案 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'