どのようにSQLを取得して、渡された各単語の最初の文字を返すことができますか。sqlは人名の文字列を選択してイニシャルを出力します
私はDBにある人々の名前の頭文字を生成するためにこのUDFを使いたいと思っています。
名は、私は、これが "名姓" と「ファーストネームMiddlenameの両方のために働く必要がありますSQL2005
どのようにSQLを取得して、渡された各単語の最初の文字を返すことができますか。sqlは人名の文字列を選択してイニシャルを出力します
私はDBにある人々の名前の頭文字を生成するためにこのUDFを使いたいと思っています。
名は、私は、これが "名姓" と「ファーストネームMiddlenameの両方のために働く必要がありますSQL2005
CREATE FUNCTION dbo.GetFirstLetter (@Array VARCHAR(1000), @separator VARCHAR(10))
RETURNS @resultTable TABLE
(parseValue VARCHAR(100))
AS
BEGIN
DECLARE @separator_position INT
DECLARE @array_value VARCHAR(1000)
SET @array = @array + @separator
WHILE patindex('%' + @separator + '%' , @array) <> 0
BEGIN
SELECT @separator_position = patindex('%' + @separator + '%', @array)
SELECT @array_value = left(@array, @separator_position - 1)
INSERT @resultTable
VALUES (SUBSTRING(Cast(@array_value AS varchar), 1, 1))
SELECT @array = stuff(@array, 1, @separator_position, '')
END
RETURN
END
を使用しています2(fnameは、LNAME)または3(... MNAME)言葉
することができ姓 "の組み合わせ。ユーザーが何らかの理由で自分の名前の 1のスペースを持っている場合はもちろん
DECLARE @name AS NVARCHAR(50)
SET @name = 'Firstname Middle Lastname'
SELECT SUBSTRING(@name, 1, 1) + --First initial
SUBSTRING(@name, CHARINDEX(' ', @name) + 1, 1) + --Middle/Last initial
CASE WHEN 0 <> CHARINDEX(' ', @name, CHARINDEX(' ', @name) + 1) -- More than two words
THEN SUBSTRING(@name, CHARINDEX(' ', @name, CHARINDEX(' ', @name) + 1) + 1, 1) --Last initial
ELSE '' --Have to add empty string to avoid NULLing entire result
END
、あなたはこれを解析する問題を持っていますが、私は、別のあなたの名前を格納していないときには、とにかくケースになり疑いますフィールド。
ここに私の解決策だし、それは、これらの機能/特殊性を持っています
OPは、彼の場合には2〜3の名前しかないと指定しています。私は気にしない。私はちょうど働く解決策を共有しています、そして、それが特定の問題のために最善でないなら、それは上手です。
だから、ここの関数です:
SELECT dbo.fnGetInitials(' John Ronald Reuel Tolkien ');
と結果:
----------------------------------------------------------------------------------------------------
J R R Tolkien
あなたは、同様のXQueryを経由して、それを達成することができます
CREATE FUNCTION dbo.fnGetInitials (@name varchar(max))
RETURNS varchar(max)
AS BEGIN
DECLARE @cutpos int, @spacepos int, @result varchar(max);
DECLARE @cutlist TABLE (CutPos int, SpacePos int);
SET @result = LTRIM(RTRIM(@name));
SET @cutpos = 2;
SET @spacepos = CHARINDEX(' ', @result);
WHILE @spacepos > 0 BEGIN
INSERT INTO @cutlist VALUES (@cutpos, @spacepos);
SET @spacepos = @spacepos + 1;
SET @cutpos = @spacepos + 1;
SET @spacepos = CHARINDEX(' ', @result, @spacepos);
END;
DELETE FROM @cutlist WHERE CutPos >= SpacePos;
SELECT @result = STUFF(@result, CutPos, SpacePos - CutPos, '')
FROM @cutlist
ORDER BY CutPos DESC;
RETURN @result;
END;
そしてここでは、テストコールです。
Declare @Xml XML
Declare @String Varchar(Max)
Declare @firstletter Varchar(Max)
Declare @delimiter Varchar(5)
SET @delimiter=' '
SET @String= 'THIS IS SQL'
SET @Xml = cast(('<a>'+replace(@String,@delimiter,'</a><a>')+'</a>') AS XML)
;WITH CTE AS
(SELECT A.value('.', 'varchar(max)') as [Column]FROM @Xml.nodes('a') AS FN(a))
SELECT Stuff((SELECT '' + LEFT([Column],1)from CTE
FOR XML PATH ('')),1,0,'')
これは完全な解決策です。
http://raresql.com/2013/04/12/sql-server-get-the-first-letter-of-each-word-in-a-string-column/