Sql 将偶数字符替换为大写,其余字符替换为小写
是否有SQL查询将字符串中的偶数字符替换为大写,其余字符替换为小写 例如,如果字符串为“sagar”,则结果应该如下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
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