AnalysisCode表中有如下字段,其中 CodeID为varchar,保存数据字符或者是英文字母(同一个TypeID只会是数字或字母,不会两样都用),现在我要在select时按[TypeID],[CodeID]排序,也就是select * from AnalysisCode order by [TypeID],[CodeID]。但在排序数字字符时就不是按我想的1,2,3,4....那样排序了,估我把select改为 select * from AnalysisCode order by [TypeID],cast([CodeID] as int。但是遇到字母字符时又会报错,不能使用cast了。那么,我想在同一TypeID下,若CodeID是数字,那么就按cast([CodeID] as int方式排序,若CodeID是字母,那就直接按字母排序,如何才能做到?TypeID(int型) CodeID(varchar型) CodeName (varchar型)
1 1 .....
1 2 .....
.. .. .....
1 10 .....
1 11 .....
2 A .....
2 B .....
2 H .....
1 1 .....
1 2 .....
.. .. .....
1 10 .....
1 11 .....
2 A .....
2 B .....
2 H .....
这样就是先按数字拍,然后按字母拍,仅限第一个字符
case
when patindex('[A-Z]',[CodeID])>0 then [CodeID]
else cast([CodeID] as int)
end
DECLARE @tb TABLE (TypeID int,CodeID varchar(10),CodeName varchar(5))
INSERT INTO @tb
SELECT 1,'1','.....' UNION ALL
SELECT 1,'2','.....' UNION ALL
SELECT 1,'9','.....' UNION ALL
SELECT 1,'A','.....' UNION ALL
SELECT 1,'30','....' UNION ALL
SELECT 1,'4B','....' UNION ALL
SELECT 1,'BD','....' UNION ALL
SELECT 1,'ZIEF','....' UNION ALL
SELECT 1,'0ADFEF','....' UNION ALL
SELECT 1,'ADFEF','....' UNION ALL
SELECT 1,'B5','....' UNION ALL
SELECT 1,'10','.....' UNION ALL
SELECT 1,'11','.....' UNION ALL
SELECT 2,'A','.....' UNION ALL
SELECT 2,'B','.....' UNION ALL
SELECT 2,'H','.....'--SQL查询如下:SELECT * FROM @tb
ORDER BY
TypeID,
CASE WHEN ISNUMERIC(CodeID)=1 THEN 0 ELSE 1 END,
CASE WHEN ISNUMERIC(CodeID)=1 THEN
RIGHT(REPLICATE('0',(SELECT MAX(LEN(CodeID)) FROM @tb))+CodeID,
(SELECT MAX(LEN(CodeID)) FROM @tb))
ELSE CodeID END/*
TypeID CodeID CodeName
----------- ---------- --------
1 1 .....
1 2 .....
1 9 .....
1 10 .....
1 11 .....
1 30 ....
1 0ADFEF ....
1 4B ....
1 A .....
1 ADFEF ....
1 B5 ....
1 BD ....
1 ZIEF ....
2 A .....
2 B .....
2 H .....(16 行受影响)*/
insert into @t select 1,'1'
union all select 2,'A'
union all select 1,'2'
union all select 2,'B'
union all select 2,'H'
union all select 1,'11'
union all select 1,'10'
select * from @t
order by typeid,case when isnumeric(codeid)=1 then cast(codeid as int) end,
case when isnumeric(codeid)<>1 then codeid end/*
typeid codeid
----------- ----------
1 1
1 2
1 10
1 11
2 A
2 B
2 H(7 行受影响)
*/
我读了半天你的描述猜的你的意思
from
(
select *, case ISNUMERIC(CodeID) when 1 then cast(CodeID as int) else 0 end as Number from AnalysisCode
) a
order by TypeID, Number, CodeID
order by typeid,case when isnumeric(codeid)=1 then cast(codeid as int) end,
case when isnumeric(codeid)<>1 then codeid end以上的确可行,但为何改为如下就报错呢?order by typeid,case when isnumeric(codeid)=1 then cast(codeid as int) else codeid end
DECLARE @tb TABLE (TypeID int,CodeID varchar(10),CodeName varchar(5))
INSERT INTO @tb
SELECT 1,'1','.....' UNION ALL
SELECT 1,'2','.....' UNION ALL
SELECT 1,'9','.....' UNION ALL
SELECT 1,'A','.....' UNION ALL
SELECT 1,'30','....' UNION ALL
SELECT 1,'4B','....' UNION ALL
SELECT 1,'BD','....' UNION ALL
SELECT 1,'ZIEF','....' UNION ALL
SELECT 1,'0ADFEF','....' UNION ALL
SELECT 1,'ADFEF','....' UNION ALL
SELECT 1,'B5','....' UNION ALL
SELECT 1,'10','.....' UNION ALL
SELECT 1,'11','.....' UNION ALL
SELECT 2,'A','.....' UNION ALL
SELECT 2,'B','.....' UNION ALL
SELECT 2,'H','.....'
SELECT * FROM @TB
ORDER BY TypeId ASC,
(CASE WHEN ISNUMERIC(CodeId)=1 THEN 1 ELSE 0 END) DESC,
(CASE WHEN ISNUMERIC(CodeId)=1 THEN CAST(CodeId AS INT) ELSE NULL END) ASC,
(CASE WHEN ISNUMERIC(CodeId)<>1 THEN CodeId ELSE NULL END) ASC
(16 row(s) affected)
TypeID CodeID CodeName
----------- ---------- --------
1 1 .....
1 2 .....
1 9 .....
1 10 .....
1 11 .....
1 30 ....
1 0ADFEF ....
1 4B ....
1 A .....
1 ADFEF ....
1 B5 ....
1 BD ....
1 ZIEF ....
2 A .....
2 B .....
2 H .....(16 row(s) affected)感谢vivian_lanlan提供测试数据代码