2011-02-01 14 views
2

どのようにSQLを取得して、渡された各単語の最初の文字を返すことができますか。sqlは人名の文字列を選択してイニシャルを出力します

私はDBにある人々の名前の頭文字を生成するためにこのUDFを使いたいと思っています。

名は、私は、これが "名姓" と「ファーストネームMiddlenameの両方のために働く必要がありますSQL2005

答えて

1
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

を使用しています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 

、あなたはこれを解析する問題を持っていますが、私は、別のあなたの名前を格納していないときには、とにかくケースになり疑いますフィールド。

0

ここに私の解決策だし、それは、これらの機能/特殊性を持っています

  • それが文字列であるしかし多くの名前を処理することができます。 (つまり、2つよりも少なくても3つ以上です。)
  • 名前の間のスペースはすべて保持されます。

OPは、彼の場合には2〜3の名前しかないと指定しています。私は気にしない。私はちょうど働く解決策を共有しています、そして、それが特定の問題のために最善でないなら、それは上手です。

だから、ここの関数です:

SELECT dbo.fnGetInitials(' John Ronald Reuel Tolkien '); 

と結果:

---------------------------------------------------------------------------------------------------- 
J R R Tolkien 
0

あなたは、同様の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/

関連する問題