sql 字符串内按字符排序求助

tteagle 2011-10-14 09:52:34
有个字段,里面都是"ABC","BDC","ADC"这样的字符串,现在要求按字符排序比如:
ABC ABC
BDC BCD
ADC ACD
我用下面的语句排序后为什么会出现很多的重复值啊?
WITH T
AS (SELECT top 26 ROW_NUMBER() OVER (ORDER BY ID) AS n
FROM SYS.SYSOBJECTS),
T2 AS
( SELECT answer,CHAR(64+N) AS M,N
FROM exam_MultiProblem JOIN T
ON CHARINDEX(CHAR(64+N),answer) > 0)
SELECT answer,replace(
(SELECT M as [data()] FROM T2 WHERE answer = T3.answer ORDER BY N FOR XML PATH('')
),' ','') AS newstr FROM exam_MultiProblem T3

现在出来的结果是这样的:

answer newstr
BAC ABC
ABCD AAABBBCCCDDD
ABC AAAAAAAABBBBBBBBCCCCCCCC
ABC AAAAAAAABBBBBBBBCCCCCCCC
BC BC
BCD BCD
ABC AAAAAAAABBBBBBBBCCCCCCCC
AB AAABBB
ABC AAAAAAAABBBBBBBBCCCCCCCC
...全文
68 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tteagle 2011-10-15
  • 打赏
  • 举报
回复

不是,是2008sp2
[Quote=引用 8 楼 fredrickhu 的回复:]

引用 3 楼 tteagle 的回复:
谢谢楼上的老大,但我用你的代码得出的结果跟我自己的一模一样,也要重复的,也会出现"AAAABBBCCC"这样的,请问是怎么回事呢?

你的数据库版本是2005?
[/Quote]
--小F-- 2011-10-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qianjin036a 的回复:]
手痒,也写一个:

SQL code
create table exam_MultiProblem(answer varchar(10))
insert into exam_MultiProblem select 'ABC'-- ABC
insert into exam_MultiProblem select 'ABDC'-- BCD
insert into exam_MultiPro……
[/Quote]
递归 必须赞一个
--小F-- 2011-10-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tteagle 的回复:]
谢谢楼上的老大,但我用你的代码得出的结果跟我自己的一模一样,也要重复的,也会出现"AAAABBBCCC"这样的,请问是怎么回事呢?
[/Quote]
你的数据库版本是2005?
tteagle 2011-10-14
  • 打赏
  • 举报
回复
这位老大的好像可以用了,就是顺序反了,谢谢

[Quote=引用 4 楼 qianjin036a 的回复:]
手痒,也写一个:

SQL code
create table exam_MultiProblem(answer varchar(10))
insert into exam_MultiProblem select 'ABC'-- ABC
insert into exam_MultiProblem select 'ABDC'-- BCD
insert into exam_MultiPro……
[/Quote]
tteagle 2011-10-14
  • 打赏
  • 举报
回复
是复制黏贴的。
[Quote=引用 5 楼 qianjin036a 的回复:]
引用 3 楼 tteagle 的回复:
谢谢楼上的老大,但我用你的代码得出的结果跟我自己的一模一样,也要重复的,也会出现"AAAABBBCCC"这样的,请问是怎么回事呢?


你是复制粘贴的吗?
[/Quote]
-晴天 2011-10-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tteagle 的回复:]
谢谢楼上的老大,但我用你的代码得出的结果跟我自己的一模一样,也要重复的,也会出现"AAAABBBCCC"这样的,请问是怎么回事呢?
[/Quote]

你是复制粘贴的吗?
-晴天 2011-10-14
  • 打赏
  • 举报
回复
手痒,也写一个:
create table exam_MultiProblem(answer varchar(10))
insert into exam_MultiProblem select 'ABC'-- ABC
insert into exam_MultiProblem select 'ABDC'-- BCD
insert into exam_MultiProblem select 'AADC'-- ACD
go
;with cte as(
select answer,1 n,convert(varchar(26),(case when CHARINDEX('A',answer)>0 then 'A' else '' end))newstr from exam_MultiProblem
union all
select a.answer,a.n+1,CONVERT(varchar(26),(case when charindex(char(ascii('A')+a.n),a.answer)>0 then a.newstr+char(ascii('A')+a.n) else a.newstr end)) from cte a where n<26
)select answer,newstr from cte where n=26
/*
answer newstr
---------- --------------------------
AADC ACD
ABDC ABCD
ABC ABC

(3 行受影响)

*/
go
drop table exam_MultiProblem
tteagle 2011-10-14
  • 打赏
  • 举报
回复
谢谢楼上的老大,但我用你的代码得出的结果跟我自己的一模一样,也要重复的,也会出现"AAAABBBCCC"这样的,请问是怎么回事呢?
-晴天 2011-10-14
  • 打赏
  • 举报
回复
不会吧!
create table exam_MultiProblem(answer varchar(10))
insert into exam_MultiProblem select 'ABC'-- ABC
insert into exam_MultiProblem select 'ABDC'-- BCD
insert into exam_MultiProblem select 'AADC'-- ACD
go
;WITH T AS(
SELECT top 26 ROW_NUMBER() OVER (ORDER BY ID) AS n FROM SYS.SYSOBJECTS
),T2 AS(
SELECT answer,CHAR(64+N) AS M,N
FROM exam_MultiProblem JOIN T
ON CHARINDEX(CHAR(64+N),answer) > 0
)
SELECT answer,replace(
(SELECT M as [data()] FROM T2 WHERE answer = T3.answer ORDER BY N FOR XML PATH('')
),' ','') AS newstr FROM exam_MultiProblem T3
/*
answer newstr
---------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ABC ABC
ABDC ABCD
AADC ACD

(3 行受影响)

*/
go
drop table exam_MultiProblem
geniuswjt 2011-10-14
  • 打赏
  • 举报
回复
问题描述不清,建议LZ想清楚了再问

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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