1

文字列の大文字が来る場所、またはスペースが本当に必要な場所にスペースを追加するにはどうすればよいですか。

サンプル コードは次のとおりです。

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
4

3 に答える 3

0

あなたは確かにこれからいくつかの助けを得るかもしれません: -

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

ここに画像の説明を入力

于 2013-09-16T16:19:39.527 に答える
0

セットベースのソリューション:

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
于 2013-09-16T19:26:11.700 に答える