【TSQL】挑战3

叶子 2011-08-02 12:51:34
这个挑战不是针对解决任何商业问题或是应用问题,仅仅是锻炼你的TSQL基础操作的技巧。这个任务是在不使用reverse()函数的情况去反转一个字符串。用reverse()函数有什么错吗?正如之前我所提到的,这正是为了提高你的TSQL基本操作的技巧。在实际应用中,无论任何时候,如果你需要如反转一个字符串,你还是应该用这个reverse()函数的。
还有,我们不是要去反转一个单独的字符串,我们需要用单独的查询去反转表中某列的所有值。

这是一个测试数据

ID data
----------- --------------------
1 Jacob
2 Sebastian

这是预期的结果

id data
----------- --------------------
2 naitsabeS
1 bocaJ

用下面的脚本去生成测试数据


DECLARE @t TABLE( ID INT IDENTITY, data VARCHAR(20))
INSERT INTO @t(data) SELECT 'Jacob'
INSERT INTO @t(data) SELECT 'Sebastian'


备注:
1.写一个单独的查询语句得到预期结果。不允许使用自定义函数。
2.确保你的代码能够在给出的测试脚本的基础上正常运行,使用相同的列名和表变量名。为了方便测试。
3.不限制SQL SERVER的版本。你可以在SQL Server 2000, 2005或是 2008上写查询语句。
...全文
186 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
liangCK 2011-08-02
  • 打赏
  • 举报
回复
把思想转到集合就都一样了。
叶子 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liangck 的回复:]

我们不是要去反转一个单独的字符串,我们需要用单独的查询去反转表中某列的所有值。
--------
这有什么区别呢?反转一个字符串会了,反转两个就不会了?三个更不会了?
[/Quote]
貌似是要一条查询语句实现,不能自定义函数,不能定义变量中转吧?
Write a single query that produces the expected result.
liangCK 2011-08-02
  • 打赏
  • 举报
回复
呵呵,看各位吧。
liangCK 2011-08-02
  • 打赏
  • 举报
回复
我们不是要去反转一个单独的字符串,我们需要用单独的查询去反转表中某列的所有值。
--------
这有什么区别呢?反转一个字符串会了,反转两个就不会了?三个更不会了?
BigInt 2011-08-02
  • 打赏
  • 举报
回复
这个有问题,中间不能有空格,算了,理想主义要不得,不过,递归CTE是可以比较灵活使用的,不一定是需要取得字符索引的
BigInt 2011-08-02
  • 打赏
  • 举报
回复
效率估计更差了
BigInt 2011-08-02
  • 打赏
  • 举报
回复
这...
有点牛角尖了,那就去掉吧(最后一次了,不再改了)

DECLARE @t TABLE( ID INT IDENTITY, data VARCHAR(20))
INSERT INTO @t(data) SELECT 'Jac ob'
INSERT INTO @t(data) SELECT 'Sebastian'
;with cte as
(
select id,cast(right(data,1) as varchar(20)) as data,cast(left(data,len(data)-1) as varchar(20)) as data1
from @t
union all
select id
,cast(data+right(data1,1) as varchar(20)) as data
,cast(left(data1,len(data1)-1) as varchar(20)) as data1
from cte c
where len(data1)>0
)
select id,data from cte a
where len(data1)=0
guguda2008 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 bigint 的回复:]

引用 19 楼 fcuandy 的回复:
引用 18 楼 guguda2008 的回复:

引用 17 楼 fcuandy 的回复:

无意义的问题。

而且加了限制后, 楼上各种写法本质都是一样的(无论是cte, row_number,临时表还是系统表), 而实际上,也只有这一种写法.

思想都是取得字符索引后反转拼接,但CTE,临时表,XML算不同的实现方法吧,呵呵。

……
[/Quote]
思想都是一样的,你那个num就是反转后的字符索引
BigInt 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 fcuandy 的回复:]
引用 18 楼 guguda2008 的回复:

引用 17 楼 fcuandy 的回复:

无意义的问题。

而且加了限制后, 楼上各种写法本质都是一样的(无论是cte, row_number,临时表还是系统表), 而实际上,也只有这一种写法.

思想都是取得字符索引后反转拼接,但CTE,临时表,XML算不同的实现方法吧,呵呵。

本质是一样的。
只是用不同方法生成字符索引……
[/Quote]

这个呢,算不同思路没
DECLARE @t TABLE( ID INT IDENTITY, data VARCHAR(20))
INSERT INTO @t(data) SELECT 'Jacob'
INSERT INTO @t(data) SELECT 'Sebastian'
;with cte as
(
select id,cast(right(data,1) as varchar(20)) as data,1 as num from @t
union all
select t.id
,cast(c.data + substring(t.data,len(t.data)-c.num,1) as varchar(20)) as data
,c.num+1 as num
from @t t,cte c
where t.id = c.id and c.num < len(t.data)
)
select id,data from cte a
where not exists (
select 1
from cte b
where b.id = a.id
and b.num > a.num
)
BigInt 2011-08-02
  • 打赏
  • 举报
回复
不想借助任何系统表,直接CTE

DECLARE @t TABLE( ID INT IDENTITY, data VARCHAR(20))
INSERT INTO @t(data) SELECT 'Jacob'
INSERT INTO @t(data) SELECT 'Sebastian'
;with cte as
(
select id,left(data,1) as data,1 as num from @t
union all
select t.id,substring(t.data,c.num+1,1) as data,c.num+1 as num from @t t,cte c
where t.id = c.id and c.num < len(t.data)
)
select a.id,(
select '' + data from cte
where id = a.id
order by num desc for xml path('')
) as data
from @t a
fcuandy 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 guguda2008 的回复:]

引用 17 楼 fcuandy 的回复:

无意义的问题。

而且加了限制后, 楼上各种写法本质都是一样的(无论是cte, row_number,临时表还是系统表), 而实际上,也只有这一种写法.

思想都是取得字符索引后反转拼接,但CTE,临时表,XML算不同的实现方法吧,呵呵。
[/Quote]
本质是一样的。
只是用不同方法生成字符索引,仅此而已。
guguda2008 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 fcuandy 的回复:]

无意义的问题。

而且加了限制后, 楼上各种写法本质都是一样的(无论是cte, row_number,临时表还是系统表), 而实际上,也只有这一种写法.
[/Quote]
思想都是取得字符索引后反转拼接,但CTE,临时表,XML算不同的实现方法吧,呵呵。
fcuandy 2011-08-02
  • 打赏
  • 举报
回复
无意义的问题。

而且加了限制后, 楼上各种写法本质都是一样的(无论是cte, row_number,临时表还是系统表), 而实际上,也只有这一种写法.
快溜 2011-08-02
  • 打赏
  • 举报
回复
我是来学习的。
sekai2011 2011-08-02
  • 打赏
  • 举报
回复
mark ..
水族杰纶 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 guguda2008 的回复:]
其实我们用LEN都没考虑空格的情况,全是不完整的,嘎嘎嘎嘎
[/Quote]
猫了个咪的
嘎嘎嘎嘎
guguda2008 2011-08-02
  • 打赏
  • 举报
回复
其实我们用LEN都没考虑空格的情况,全是不完整的,嘎嘎嘎嘎
guguda2008 2011-08-02
  • 打赏
  • 举报
回复
这个简单,用CTE转一下就好
DECLARE @t TABLE( ID INT IDENTITY, data VARCHAR(20))
INSERT INTO @t(data) SELECT 'Jacob'
INSERT INTO @t(data) SELECT 'Sebastian'
;WITH MU AS (
SELECT T1.*,ROW_NUMBER() OVER(PARTITION BY T1.ID ORDER BY T2.NUMBER DESC) AS NUMBER,SUBSTRING(T1.DATA,T2.NUMBER,1) AS DATA2
FROM @T T1
INNER JOIN MASTER..SPT_VALUES T2 ON LEN(T1.DATA)>=T2.NUMBER AND T2.TYPE='P' AND T2.NUMBER>0
)
,MU2 AS (
SELECT *,CONVERT(VARCHAR(MAX),DATA2) AS DATA3,1 AS LEVEL FROM MU WHERE NUMBER=1
UNION ALL
SELECT MU.*,MU2.DATA3+MU.DATA2,MU2.LEVEL+1
FROM MU
INNER JOIN MU2 ON MU.NUMBER=MU2.NUMBER+1 AND MU.ID=MU2.ID
)
SELECT DATA,DATA3
FROM MU2 T1
WHERE NOT EXISTS(
SELECT 1 FROM MU2 T2 WHERE T2.LEVEL>T1.LEVEL AND T2.ID=T1.ID
)
cd731107 2011-08-02
  • 打赏
  • 举报
回复
--2005
DECLARE @t TABLE( ID INT IDENTITY, data VARCHAR(20))
INSERT INTO @t(data) SELECT 'Jacob'
INSERT INTO @t(data) SELECT 'Sebastian'

select fgid=(select ''+name
from
(
select data,substring(a.data,b.number+1,1)name,number from @t a ,master..spt_values b
where type='p' and number<=len(a.data)) tb
where tb.data=ta.data order by number desc for xml path('') )
from @t ta
chuanzhang5687 2011-08-02
  • 打赏
  • 举报
回复
我是来学习的
加载更多回复(5)

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧