SQL CE(紧凑版)中的字母数字字段进行排序3.5版本(紧凑型版)

treenumber是一个具有数字和字符串的NVARCHAR场。我想对这些记录进行排序,以便包含alpha字符的记录位于顶部,其余的记录按数字顺序排序。

我想要与以下查询相似的东西,该查询在SQL Server中工作:

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

上述查询似乎不起作用,因为CE中不支持[]范围。与SQL Server一起使用但在CE中不起作用的另一个解决方案,因为不支持“ ISNUMBER()”以下:

SELECT * FROM Tree 
ORDER BY 
    (CASE IsNumeric(TreeNumber) WHEN 0 THEN 0 ELSE TreeNumber END), TreeNumber
有帮助吗?

解决方案

好的,这个解决方案很丑陋,不是为了胆小的人。我尚未在SQL CE上进行测试,但它仅使用基本的T-SQL,因此应该可以。您将必须创建一个 计数表 (如果您不想阅读他的第一个代码,只需运行他的第一个代码。它使用tempdb,因此您想更改它),以及一张表格的表格(由于缺乏模式匹配,职能)。创建Tally表之后(如示例所示,您无需一路走到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表中没有行的行是数字。

其他提示

CE中支持功能吗?您可以自己制作自己的ISNUEMRIC函数(例如,Char Parser的简单字符),并在查询中稍后调用

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top