【问题标题】:How do you prepend space in a string where Upper Case letter comes or where a space really needed [duplicate]您如何在大写字母出现或真正需要空格的字符串中添加空格[重复]
【发布时间】:2013-09-16 16:14:15
【问题描述】:

如何在大写字母出现或真正需要空格的字符串中添加空格。

示例代码为:

DECLARE @teams TABLE (Team NVARCHAR(100))

INSERT INTO @teams
SELECT 'TataConsultencyServices'
UNION ALL
SELECT 'TataConsultencyCompany'
UNION ALL
SELECT 'CompanyHumanResource'

预期结果

Tata Consultency Services
Tata Consultency Company
Company Human Resource

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    基于集合的解决方案:

    DECLARE @s NVARCHAR(100);
    SET @s = 'CompanyHumanResources';
    
    DECLARE @Idx INT = 1;
    WITH CteRecursive
    AS
    (
        SELECT  1 AS Idx, 
                CONVERT(NVARCHAR(200), @s) AS String
        UNION ALL
        SELECT  src.Idx + src.IsUpper + 1,
                CONVERT(NVARCHAR(200),
                    CASE WHEN src.IsUpper = 1 THEN STUFF(src.String, src.Idx+1, 0, ' ') ELSE src.String END
                )
        FROM
        (
            SELECT  rec.*,
                    CASE WHEN SUBSTRING(rec.String, rec.Idx, 1) <> ' ' AND SUBSTRING(rec.String, rec.Idx+1, 1) LIKE '[A-Z]' AND SUBSTRING(rec.String, rec.Idx+1, 1) COLLATE Romanian_CS_AS = UPPER(SUBSTRING(rec.String, rec.Idx+1, 1)) COLLATE Romanian_CS_AS THEN 1 ELSE 0 END AS IsUpper
            FROM    CteRecursive rec
            WHERE   rec.Idx + 1 <= LEN(rec.String)
        ) src
    )
    SELECT  TOP(1) x.String
    FROM    CteRecursive x
    ORDER BY x.Idx DESC;
    

    结果:

    String
    -----------------------
    Company Human Resources
    

    【讨论】:

    • 您应该将我的排序规则 (Romanian_CS_AS) 替换为您的区分大小写 (..._CS_...) 排序规则。
    • 很好,但我不得不说,我不能自己做这个查询逻辑,所以我正在搜索新的简单逻辑,如果我能得到它就会发布它
    • 但这不适用于像 'TCSolutions' 这样的参数,它会返回像 T C Solutions 这样的结果,这实际上不是必需的
    • 这是缩进行为。您的问题中没有这样的要求。
    【解决方案2】:

    你肯定会从this得到一些帮助:-

    CREATE FUNCTION CaseSensitiveSQLSplitFunction
    (
     @str nvarchar(max)
    )
    returns @t table (val nvarchar(max))
    as
    begin
    
    declare @i int, @j int
    select @i = 1, @j = len(@str)
    
    declare @w nvarchar(max)
    
    while @i <= @j
    begin
     if substring(@str,@i,1) = UPPER(substring(@str,@i,1)) collate Latin1_General_CS_AS
     begin
      if @w is not null
       insert into @t (val) select @w
      set @w = substring(@str,@i,1)
     end
     else
      set @w = @w + substring(@str,@i,1)
     set @i = @i + 1
    end
    if @w is not null
     insert into @t (val) select @w
    
    return
    
    end
    

    以样本为:-

    declare @str nvarchar(max) = N'ThisIsATest'
    select * from dbo.CaseSensitiveSQLSplitFunction(@str)
    set @str = N'ThisIsASqlServerCaseSensitiveSplitStringFunction'
    select * from dbo.CaseSensitiveSQLSplitFunction(@str)
    

    现在可以以从行到单列值的方式对字符串值进行 sql 连接。 我们可以使用任何 sql 连接函数。

    declare @str nvarchar(max) = N'ThisIsATest'
    SELECT LTRIM(STUFF((
      SELECT ' ' + val FROM dbo.CaseSensitiveSQLSplitFunction(@str) FOR XML PATH('')
      ), 1, 1, '')) string
    
    set @str = N'ThisIsASqlServerCaseSensitiveSplitStringFunction'
    SELECT LTRIM(STUFF((
      SELECT ' ' + val FROM dbo.CaseSensitiveSQLSplitFunction(@str) FOR XML PATH('')
      ), 1, 1, '')) string
    

    【讨论】:

    • 感谢好友,帮助您了解更多有关区分大小写的内容。
    • 不客气。如果 yiu 认为它值得,请为答案投票..:-)
    【解决方案3】:

    当 1 = 1 开始 更新@teams SET TeamName = STUFF(TeamName, patindex('%[a-z,.][A-Z]%', TeamName COLLATE Latin1_General_BIN) + 1,0,' ') WHERE patindex('%[a-z,.][A-Z]%', TeamName COLLATE Latin1_General_BIN) > 0

              IF @@ROWCOUNT = 0 BREAK
    

    结束

    更新@teams SET TeamName = STUFF(TeamName, patindex('%[A-Z][a-z]%', RIGHT(TeamName,LEN(TeamName) -1) COLLATE Latin1_General_BIN) +1 ,0,' ') WHERE patindex('%[A-Z][a-z]%', TeamName COLLATE Latin1_General_BIN) > 0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-04
      • 2019-10-21
      • 2021-08-18
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多