Пробел T-SQL перед заглавными буквами - PullRequest
11 голосов
/ 31 декабря 2010

Вопрос не требует пояснений.Не могли бы вы указать способ поставить пробелы между каждой заглавной буквой строки.

SELECT dbo.SpaceBeforeCap('ThisIsATestString')

приведет к

This Is A Test String.

Ответы [ 5 ]

11 голосов
/ 18 мая 2011

Это будет добавлять пробелы, только если предыдущий и следующий символ в нижнем регистре.Таким образом, «MyABCAnalysis» будет «Мой анализ ABC».

Я также добавил проверку для предыдущего пробела.Поскольку некоторые из наших строк имеют префикс «GR_», а некоторые также содержат подчеркивания, мы можем использовать функцию замены следующим образом:

select dbo.GR_SpaceBeforeCap (replace ('GR_ABCAnalysis_Test', '_', '')) Возвращает «GR ABC Analysis Test»

CREATE FUNCTION GR_SpaceBeforeCap (
    @str nvarchar(max)
)
returns nvarchar(max)
as
begin

declare
    @i int, @j int
,   @cp nchar, @c0 nchar, @c1 nchar
,   @result nvarchar(max)

select
    @i = 1
,   @j = len(@str)
,   @result = ''

while @i <= @j
begin
    select
        @cp = substring(@str,@i-1,1)
    ,   @c0 = substring(@str,@i+0,1)
    ,   @c1 = substring(@str,@i+1,1)

    if @c0 = UPPER(@c0) collate Latin1_General_CS_AS
    begin
        -- Add space if Current is UPPER 
        -- and either Previous or Next is lower
        -- and Previous or Current is not already a space
        if @c0 = UPPER(@c0) collate Latin1_General_CS_AS
        and (
                @cp <> UPPER(@cp) collate Latin1_General_CS_AS
            or  @c1 <> UPPER(@c1) collate Latin1_General_CS_AS
        )
        and @cp <> ' '
        and @c0 <> ' '
            set @result = @result + ' '
    end -- if @co

    set @result = @result + @c0
    set @i = @i + 1
end -- while

return @result
end
7 голосов
/ 31 декабря 2010

Предполагается, что SQL Server 2005 или более поздняя версия изменена из кода, взятого здесь: http://www.kodyaz.com/articles/case-sensitive-sql-split-function.aspx

CREATE FUNCTION SpaceBeforeCap
(
 @str nvarchar(max)
)
returns nvarchar(max)
as
begin

declare @i int, @j int
declare @returnval nvarchar(max)
set @returnval = ''
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
  set @returnval = @returnval + ' ' + @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
 set @returnval = @returnval + ' ' + @w

return ltrim(@returnval)

end

Это можно вызвать так же, как вы предложили выше.

3 голосов
/ 05 марта 2014

Эта функция объединяет предыдущие ответы. Выборочно выбрать сохранение смежных колпачков:

CREATE FUNCTION SpaceBeforeCap (
    @InputString NVARCHAR(MAX),
    @PreserveAdjacentCaps BIT
)
RETURNS NVARCHAR(MAX)
AS
BEGIN

DECLARE
    @i INT, @j INT,
        @previous NCHAR, @current NCHAR, @next NCHAR,
        @result NVARCHAR(MAX)

SELECT
    @i = 1,
        @j = LEN(@InputString),
        @result = ''

WHILE @i <= @j
BEGIN
    SELECT
        @previous = SUBSTRING(@InputString,@i-1,1),
                @current = SUBSTRING(@InputString,@i+0,1),
                @next = SUBSTRING(@InputString,@i+1,1)

    IF @current = UPPER(@current) COLLATE Latin1_General_CS_AS
    BEGIN
        -- Add space if Current is UPPER 
        -- and either Previous or Next is lower or user chose not to preserve adjacent caps
        -- and Previous or Current is not already a space
        IF @current = UPPER(@current) COLLATE Latin1_General_CS_AS
        AND (
                            @previous <> UPPER(@previous) COLLATE Latin1_General_CS_AS
                            OR  @next <> UPPER(@next) collate Latin1_General_CS_AS
                            OR  @PreserveAdjacentCaps = 0
        )
        AND @previous <> ' '
        AND @current <> ' '
            SET @result = @result + ' '
    END 

    SET @result = @result + @current
    SET @i = @i + 1
END 

RETURN @result
END

GO
SELECT dbo.SpaceBeforeCap('ThisIsASampleDBString', 1)
GO
SELECT dbo.SpaceBeforeCap('ThisIsASampleDBString', 0)
1 голос
/ 26 февраля 2012

Другая стратегия заключается в проверке значения ascii каждого символа:

create function SpaceBeforeCap
 (@str nvarchar(max))
returns nvarchar(max)
as
begin
  declare @result nvarchar(max)= left(@str, 1), 
          @i int = 2

  while @i <= len(@str)
  begin
    if ascii(substring(@str, @i, 1)) between 65 and 90
      select @result += ' '
    select @result += substring(@str, @i, 1)
    select @i += 1 
  end

  return @result
 end

 /***
  SELECT dbo.SpaceBeforeCap('ThisIsATestString') 
 **/
1 голос
/ 31 декабря 2010

CLR и регулярные выражения или 26 заменяют операторы регистром с учетом регистра и усечением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...