2010-11-26 113 views
3

排序字母數字字段在SQL CE字母排序字段(精簡版)版本3.5在SQL CE(精簡版)版本3.5

TreeNumber是與價值觀數字和字符串的混合一個nvarchar的領域。我想排序這些記錄,以便包含字母字符的記錄位於頂部,其餘按數字順序排序。

我想類似下面的查詢其在SQL Server中工作的東西:

SELECT * FROM Tree 
ORDER BY 
    (CASE WHEN TreeNumber LIKE '%[a-z]%' THEN 0 ELSE TreeNumber END), TreeNumber 

上面的查詢似乎並沒有工作,因爲[]範圍不CE支持。另一個與SQL Server一起使用但在CE中不起作用的解決方案如下:

SELECT * FROM Tree 
ORDER BY 
    (CASE IsNumeric(TreeNumber) WHEN 0 THEN 0 ELSE TreeNumber END), TreeNumber 

回答

1

好的,這個解決方案很醜,不適合心臟不好的人。我沒有在SQL CE上測試,但它只使用基本的t-sql,所以它應該沒問題。你將不得不創建一個tally table(如果你不想讀它,只需運行他的第一個代碼塊,它使用tempdb,所以你需要改變它)和一個表來保存字母表中的每個字母(由於缺乏模式匹配功能)。創建理貨表後(您不必一路走到11000,如示例所示),運行這些表,您將看到您想要的排序行爲

創建字母表(用於演示目的的溫度):

select * 
into #alphatable 
from 
(

select 'A' as alpha union all 
select 'B' union all 
select 'C' union all 
select 'D' 
--etc. etc. 
) x 

創建樹表(臨時用於演示目的):

select * 
into #tree 
from 
(

select 'aagew' as TreeNumber union all 
select '3' union all 
select 'bsfreww' union all 
select '1' union all 
select 'xcaswf' 
) x 

解決辦法:

select TreeNumber 
from 
(
select t.*, tr.*, substring(TreeNumber, case when N > len(TreeNumber) then len(TreeNumber) else N end, 1) as singleChar 
from tally t 
cross join #tree tr 
where t.N < (select max(len(TreeNumber)) from #tree) 

) z 
left join 
#alphatable a 
on z.singlechar = a.alpha 
group by TreeNumber 

order by case when max(alpha) is not null then 0 else TreeNumber end 

這基本上是Moden描述爲「跨越字符」的技術,然後每個字符都加入到alpha表中。在alpha表中沒有行的行是數字。

1

CE中是否支持函數?你可以創建你自己的IsNuemric函數(例如char char),稍後在你的查詢中調用它。