Sql 将偶数字符替换为大写,其余字符替换为小写

Sql 将偶数字符替换为大写,其余字符替换为小写,sql,sql-server,Sql,Sql Server,是否有SQL查询将字符串中的偶数字符替换为大写,其余字符替换为小写 例如,如果字符串为“sagar”,则结果应该如下 sAgAr 对此,什么是合适的解决方案?编写了下面的代码,效果很好 在主数据库上测试 declare @name nvarchar(50) declare @i int set @i=1 set @name='sagar' while(@i<=LEN(@name)) begin if(@i%2=0) begin print Upper(SUBSTR

是否有SQL查询将字符串中的偶数字符替换为大写,其余字符替换为小写

例如,如果字符串为“sagar”,则结果应该如下

sAgAr

对此,什么是合适的解决方案?

编写了下面的代码,效果很好

在主数据库上测试

declare @name nvarchar(50)
declare @i int
set @i=1
set @name='sagar'
while(@i<=LEN(@name))
begin
if(@i%2=0)
    begin
        print Upper(SUBSTRING(@name,@i,1))
        set @i=@i+1
    end
else
    begin
        print Lower(SUBSTRING(@name,@i,1))
        set @i=@i+1
    end
end

在设置@name参数时,给出您自己选择的名称,您就可以得到所需的结果了

编写了下面的代码,效果很好

在主数据库上测试

declare @name nvarchar(50)
declare @i int
set @i=1
set @name='sagar'
while(@i<=LEN(@name))
begin
if(@i%2=0)
    begin
        print Upper(SUBSTRING(@name,@i,1))
        set @i=@i+1
    end
else
    begin
        print Lower(SUBSTRING(@name,@i,1))
        set @i=@i+1
    end
end
在设置@name参数时给出您自己选择的名称,您可以使用计数表获得所需的结果

declare @table table ([name] varchar(64))
insert into @table
values 
('sAgAr')
,('abcdefghijk')
,('LMNOPQ')

;WITH
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
    E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
    cteTally(N) AS 
    (
        SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
    )


select 
    t.[name]
    ,lower(left(t.[name],1))
     + 
     STUFF((
        SELECT '' + case 
                        when c2.N%2 = 0 then upper(substring(t2.[name],c2.N,1)) 
                        else lower(substring(t2.[name],c2.N,1)) 
                    end
        FROM @table t2
        cross apply cteTally c2
        where 
            len(t2.[name]) >= c2.N
            and t2.name = t.name
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
from
    @table t
使用理货台

declare @table table ([name] varchar(64))
insert into @table
values 
('sAgAr')
,('abcdefghijk')
,('LMNOPQ')

;WITH
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
    E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
    cteTally(N) AS 
    (
        SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
    )


select 
    t.[name]
    ,lower(left(t.[name],1))
     + 
     STUFF((
        SELECT '' + case 
                        when c2.N%2 = 0 then upper(substring(t2.[name],c2.N,1)) 
                        else lower(substring(t2.[name],c2.N,1)) 
                    end
        FROM @table t2
        cross apply cteTally c2
        where 
            len(t2.[name]) >= c2.N
            and t2.name = t.name
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
from
    @table t

这是通过拆分为行并重新创建字符串实现的:

declare @test table ([value] nvarchar(20))
insert into @test values ('sagar'), ('Blueprint'), ('turtLe')

;with cte as (
    select [value]
        , num
        , iif(num % 2 = 0, upper(substring([value], num, 1)), lower(substring([value], num, 1))) as [char]
    from @test
    cross join (values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12)) numbers(num) --add more for > 12 characters
    where num <= len([Value]))
select distinct [Value], [CaseApplied] = STUFF(( SELECT '' + [char]
                FROM    cte AS c
                WHERE c.[value]= cte.value
                FOR XML PATH('')
                ), 1, 0, '')
from cte

这是通过拆分为行并重新创建字符串实现的:

declare @test table ([value] nvarchar(20))
insert into @test values ('sagar'), ('Blueprint'), ('turtLe')

;with cte as (
    select [value]
        , num
        , iif(num % 2 = 0, upper(substring([value], num, 1)), lower(substring([value], num, 1))) as [char]
    from @test
    cross join (values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12)) numbers(num) --add more for > 12 characters
    where num <= len([Value]))
select distinct [Value], [CaseApplied] = STUFF(( SELECT '' + [char]
                FROM    cte AS c
                WHERE c.[value]= cte.value
                FOR XML PATH('')
                ), 1, 0, '')
from cte
这里有一个方法:

DECLARE @mystringLOW varchar(100) = 'sagar'
       ,@pos int = 2

WHILE @pos <= LEN(@mystringLOW)
BEGIN
SET @mystringLOW = (SELECT STUFF(@mystringLOW, @pos, 1, UPPER(SUBSTRING(@mystringLOW, @pos, 1))))
SET @pos += 2
END

SELECT @mystringLOW AS [my answer]
这里有一个方法:

DECLARE @mystringLOW varchar(100) = 'sagar'
       ,@pos int = 2

WHILE @pos <= LEN(@mystringLOW)
BEGIN
SET @mystringLOW = (SELECT STUFF(@mystringLOW, @pos, 1, UPPER(SUBSTRING(@mystringLOW, @pos, 1))))
SET @pos += 2
END

SELECT @mystringLOW AS [my answer]

我忍不住回答。对于递归CTE来说,这似乎是很自然的:

with t as (
      select 'abcdef' as str
     ),
     cte as (
      select cast(lower(str) as varchar(max)) as str, 1 as pos
      from t
      union all
      select stuff(str, pos + 1, 1,
                   (case when pos % 2 = 1 then upper(substring(str, pos + 1, 1))
                         else lower(substring(str, pos + 1, 1))
                    end)
                   ) as str, 1 + pos
      from cte
      where pos < len(str)
     )
select top (1) *
from cte
order by pos desc;

我忍不住回答。对于递归CTE来说,这似乎是很自然的:

with t as (
      select 'abcdef' as str
     ),
     cte as (
      select cast(lower(str) as varchar(max)) as str, 1 as pos
      from t
      union all
      select stuff(str, pos + 1, 1,
                   (case when pos % 2 = 1 then upper(substring(str, pos + 1, 1))
                         else lower(substring(str, pos + 1, 1))
                    end)
                   ) as str, 1 + pos
      from cte
      where pos < len(str)
     )
select top (1) *
from cte
order by pos desc;

也许我的tea还没有开始,有问题吗?不是打印你想要生成行吗?你已经发布了工作代码,我没有看到问题,那么你应该将你的答案移动到一个答案,请你验证结果并建议我是否有更好的答案也许我的茶还没有开始,有问题吗?不是打印你想生成行吗?你已经发布了工作代码,我没有看到问题,那么你应该将答案移动到一个答案,请您验证结果,并建议我是否有更好的答案,而不是将其包含在您的问题中。一致性是优秀开发人员的标志。您将@name定义为nvarchar,但在赋值时使用了ascii文本。你也应该终止你的陈述。最后,您的代码无法正常工作,因为它一次只打印一个字母。可以很容易地将其更改为一次打印正确的值,但您的选择不同。为了补充@SMor,大多数SQL Server面试问题都在寻找基于集合的方法,而不是在大多数OOP和脚本语言中快速循环的方法,而在SQL Server中则不然。一致性是优秀开发人员的标志。您将@name定义为nvarchar,但在赋值时使用了ascii文本。你也应该终止你的陈述。最后,您的代码无法正常工作,因为它一次只打印一个字母。可以很容易地将其更改为一次打印正确的值,但您选择了不同的方法。为了补充@SMor,大多数SQL Server面试问题都在寻找基于集合的方法,而不是在大多数OOP和脚本语言中快速循环的方法,但在SQL Server中却不是。这与我的方法类似,除非我使用了一个计数表而不是表构造函数,所以交叉连接的值的数量是动态的+meThis中的1与我的方法类似,只是我使用了一个计数表而不是表构造函数,因此必须交叉连接的值的数量是动态的+从我这里得到1