【问题标题】:Remove spacing between 2 words删除 2 个单词之间的空格
【发布时间】:2014-10-01 14:59:45
【问题描述】:

我有一个包含名字和第二个名字的列。现在我想创建一个函数,它删除名字和姓氏之间的所有空格,并将第一个字母作为大写字母跟随小写字母。

例如,如果用户键入..

muKesH          AmBanI

然后我将输出作为

Mukesh Ambani

使用 MS SQL 服务器,第一个大写字母只有一个空格。

【问题讨论】:

  • 你为什么将两个信息存储在一个列中?解决真正的问题,而不是与症状作斗争。
  • @TimSchmelter 没有我只存储在两列中,但许多用户在同一个文本框中输入第一个名字和中间名,并且错误地放置了 mny 个空格,所以我想删除它们。
  • "then i will get the Output as a"实际上意味着这是你想要得到的?

标签: sql sql-server replace trim


【解决方案1】:

请尝试:

declare @var nvarchar(500)='muKesH    AmBanI'

select 
    STUFF(FN, 1, 1, UPPER(LEFT(FN, 1)))+' '+
    STUFF(LN, 1, 1, UPPER(LEFT(LN, 1)))
FROM(
    select 
        LOWER(SUBSTRING(@var, 1, charindex(' ', @var)-1)) FN,
        LOWER(LTRIM(SUBSTRING(@var, charindex(' ', @var), 500))) LN
)x

AS函数

CREATE FUNCTION  FormatString(@text varchar(100))
RETURNS varchar(100)
AS 
BEGIN

    SET @text=@text+' '

    SELECT @text=
        STUFF(FN, 1, 1, UPPER(LEFT(FN, 1)))+' '+
        ISNULL(STUFF(LN, 1, 1, UPPER(LEFT(LN, 1))), '')
    FROM(
        SELECT 
            LOWER(SUBSTRING(@text, 1, charindex(' ', @text)-1)) FN,
            LOWER(RTRIM(LTRIM(SUBSTRING(@text, charindex(' ', @text), 500)))) LN
    )x

RETURN @text
END

【讨论】:

    【解决方案2】:

    最好的解决方案是构建一个函数。从网上提供的操作中获得一些灵感后,我将其改编为您的查询;

    CREATE FUNCTION  FormatString(@text varchar(100))
    RETURNS varchar(100)
    AS 
    declare @counter int, 
            @length int,
            @char char(1),
            @textnew varchar(4000)
    
        ' @text = 'muKesH          AmBanI'
        set @text       = rtrim(@text)
        set @text       = lower(@text)
        set @length     = len(@text)
        set @counter    = 1
    
        set @text = upper(left(@text, 1) ) + right(@text, @length - 1) 
    
        while @counter <> @length --+ 1
        begin
            select @char = substring(@text, @counter, 1)
    
            IF @char = space(1)  or @char =  '_' or @char = ','  or @char = '.' or @char = '\'
     or @char = '/' or @char = '(' or @char = ')'
            begin
                set @textnew = left(@text, @counter)  + upper(substring(@text, 
    @counter+1, 1)) + right(@text, (@length - @counter) - 1)
                set @text    = @textnew
            end
    
            set @counter = @counter + 1
        end
    
        return replace(replace(replace(@text,' ','<>'),'><',''),'<>',' ')
    
    END
    

    【讨论】:

    • 非常感谢,我现在知道了,这是我想要得到的纯粹答案。我的项目的完美作品。非常感谢
    【解决方案3】:

    根据输出修改查询

    DECLARE @t varchar(50)
    SELECT @t = 'mukesh          AmBanI'
    SELECT UPPER(LEFT(@t,1))+ SUBSTRING(REPLACE(REPLACE(RTRIM(LTRIM(@t)),'  ',' '),'  ',''),2,5)+' '+
    LEFT(LTRIM(REVERSE(LEFT(REVERSE(@t),PATINDEX('% %',@t )))),1)+LOWER(SUBSTRING(LTRIM(REVERSE(LEFT(REVERSE(@t),PATINDEX('% %',@t )))),2,5))
    

    【讨论】:

    • 这不会初始化上限。
    • @PatrickHofman 你想要的结果与上面显示的一样。也制作大写字母...
    • 这是 OP 的要求,是的。
    【解决方案4】:

    试试这个:

    DECLARE @Name VARCHAR(100) = 'muKesH          AmBanI'
    DECLARE @Output VARCHAR(100)
    SET @Output = LOWER(STUFF(@Name, CHARINDEX(' ',@Name), LEN(@Name)-CHARINDEX(' ',REVERSE(@Name))+1-CHARINDEX(' ',@Name)+1,' '))
    SET @Output = STUFF(@Output, CHARINDEX(' ',@Output)+1, 1, UPPER(SUBSTRING(@Output,CHARINDEX(' ',@Output)+1,1)))
    SET @Output = UPPER(LEFT(@Output, 1)) + RIGHT(@Output, LEN(@Output)-1)
    
    SELECT @Output
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-25
      • 2014-07-30
      • 1970-01-01
      • 2012-05-29
      • 2016-06-10
      • 2018-05-14
      • 2021-08-12
      • 1970-01-01
      相关资源
      最近更新 更多