在 SQL CE(精简版)版本 3.5 中对字母数字字段进行排序

标签 sorting sql-order-by sql-server-ce alphanumeric

在 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 的解决方案,因为不支持“IsNumber()”,如下所示:

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

最佳答案

好吧,这个解决方案很丑陋,不适合胆小的人。我还没有在 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 表中没有行的行是数字。

关于在 SQL CE(精简版)版本 3.5 中对字母数字字段进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4285504/

相关文章:

SQL 按分组排序

c# - 为 SQL Compact 4 设置 EF4 数据源

python - 如何按值对计数器进行排序? - Python

java - map 按值排序

linux - 如何在 Linux 中只打印目录中最大的文件?

php - MySQL GROUP BY 和 ORDER BY DESC

r - 使用不同的调用方案按列对数据帧进行排序

mysql - 为什么我的订单不区分大小写,因为未能正确排序结果?

sql - 我可以在 Mono 上使用 SQL Server Compact Edition CE 吗?

c++ - 从 MFC 应用程序连接到 SQL Server Compact Edition (.sdf)