在sql server中从名字中拆分中间首字母

在sql server中从名字中拆分中间首字母,sql,sql-server,Sql,Sql Server,我想从名字中分割中间名,只有名字有空格,后面的空间也应该是1个字符,如果它有超过1个字符,我们应该把整字符串作为第一个名字。 例如:输入字符串为“MATE K”,则应将其拆分为两部分 Firstname=MATE&MiddleInitial=K 但若输入字符串是“MATE-KATE”,那个么它就不应该拆分并保持原样 名字=凯特 这里有一个例子,我做了工作,但它并没有给我预期的输出 有人能帮我吗 declare @name as varchar(50) set @name ='MATE KATE'

我想从名字中分割中间名,只有名字有空格,后面的空间也应该是1个字符,如果它有超过1个字符,我们应该把整字符串作为第一个名字。

例如:输入字符串为“MATE K”,则应将其拆分为两部分

Firstname=MATE&MiddleInitial=K

但若输入字符串是“MATE-KATE”,那个么它就不应该拆分并保持原样

名字=凯特

这里有一个例子,我做了工作,但它并没有给我预期的输出

有人能帮我吗

declare @name as varchar(50)
set @name ='MATE KATE'
select left(@name, CHARINDEX(' ', @name)) as FirstName,
substring(@name, CHARINDEX(' ', @name) +1, len(@name)-(CHARINDEX(' ',@name)-1)) as MiddleInitial
希望这有帮助

    declare @name as varchar(50)
set @name ='MATE    K'
select CASE WHEN CHARINDEX(' ',REVERSE(LTRIM(RTRIM(@name))),0)=2 THEN left(LTRIM(RTRIM(@name)), CHARINDEX(' ', LTRIM(RTRIM(@name))))   ELSE   LTRIM(RTRIM(@name)) END AS firstname,
CASE  WHEN CHARINDEX(' ',REVERSE(LTRIM(RTRIM(@name))),0)=2 THEN LTRIM(RTRIM(substring(LTRIM(RTRIM(@name)), CHARINDEX(' ', LTRIM(RTRIM(@name))) +1, len(LTRIM(RTRIM(@name)))-(CHARINDEX(' ',LTRIM(RTRIM(@name)))-1))))  ELSE ''  END  as MiddleInitial

<>这不会考虑所有可能的坏字符串,但会给你一个起点。最好不要在
SQL
中这样做,而是使用一些
CLR
<代码>SQL实际上不应该做这样的事情,而且非常有限:

DECLARE @t TABLE ( s VARCHAR(MAX) )
INSERT  INTO @t
VALUES  ( 'MATE K' ),
        ( 'MATE KATE' )


SELECT  SUBSTRING(s, 1,
                  CASE WHEN SUBSTRING(REVERSE(s), 2, 1) = ' '
                       THEN CHARINDEX(' ', s) - 1
                       ELSE LEN(s)
                  END) AS FirstName ,
        CASE WHEN SUBSTRING(REVERSE(s), 2, 1) = ' '
             THEN SUBSTRING(s, LEN(s), 1)
             ELSE NULL
        END AS MiddleName
FROM    @t
输出:

FirstName   MiddleName
MATE        K
MATE KATE   NULL

这应该可以完成这项工作,但可以简化:

DECLARE @name AS VARCHAR(50)
SET @name = 'MATE K'

SELECT  CASE WHEN CHARINDEX(' ', @name) != LEN(@name) - 1 THEN @name
             ELSE LEFT(@name, CHARINDEX(' ', @name))
        END AS FirstName ,
        CASE WHEN CHARINDEX(' ', @name) = LEN(@name) - 1
             THEN SUBSTRING(@name, CHARINDEX(' ', @name) + 1, 1)
             ELSE ''
        END AS MiddleName

Output:
FirstName   MiddleName
MATE        K

SET @name = 'MATE KATE'

SELECT  CASE WHEN CHARINDEX(' ', @name) != LEN(@name) - 1 THEN @name
             ELSE LEFT(@name, CHARINDEX(' ', @name))
        END AS FirstName ,
        CASE WHEN CHARINDEX(' ', @name) = LEN(@name) - 1
             THEN SUBSTRING(@name, CHARINDEX(' ', @name) + 1, 1)
             ELSE ''
        END AS MiddleName

-- Output:
    Output:
FirstName   MiddleName
MATE KATE       
借助XML:

DECLARE @name varchar(50),
        @xml xml

SET @name ='Mate Kate'

SELECT @xml = CAST('<f><n>' + REPLACE(@name,' ','</n><n>') + '</n></f>' as xml)

;WITH cte AS (
SELECT  t.v.value('.','nvarchar(50)') as Names,
        CASE WHEN LEN(t.v.value('.','nvarchar(50)')) = 1 THEN 1 ELSE 0 END as LenName,
        row_number() over(order by t.v) as RowNumber
FROM @xml.nodes('/f/n') as t(v)
WHERE NULLIF(t.v.value('.','nvarchar(50)'),'') IS NOT NULL
)

SELECT 
    STUFF(
    (SELECT ' ' + NAMES
    FROM cte
    WHERE LenName = 0 OR (LenName = 1 and RowNumber = 1)
    FOR XML PATH('')),1,1,'') as FirstName,
    STUFF(
    (SELECT ' ' + NAMES
    FROM cte
    WHERE LenName = 1 AND RowNumber != 1
    FOR XML PATH('')),1,1,'') as MiddleInitial
对于
'Mate K'
'Mate K'

FirstName   MiddleInitial
Mate Kate   NULL
FirstName   MiddleInitial
Mate        K
对于
'M Kate'
'M Kate'

FirstName   MiddleInitial
Mate Kate   NULL
FirstName   MiddleInitial
Mate        K
FirstName   MiddleInitial
M Kate      NULL

MATEKATE没有空间你需要名字作为MateKate@mohan111如果输入字符串有空格,那么我们也将存储空格。例如,如果输入字符串是“MATE KATE”,那么我们将在firstname列中存储“MATE KATE”。如果有
M KATE
?@gofr1,在这种情况下,我们将M KATE存储为firstname谢谢!!!但是如果输入字符串像这个伙伴K.可能会失败,也就是说,如果MID和KIF之间有多个(可能是4或5个空间),在输入中会有更多的空间,这会破坏结果。@ GOFR1,不仅仅是空间:我提到你不能考虑所有可能的情况。