【问题标题】:Sorting Alphanumeric field in SQL CE (Compact Edition) version 3.5在 SQL CE(精简版)3.5 版中对字母数字字段进行排序
【发布时间】:2010-11-26 13:06:15
【问题描述】:

在 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

【问题讨论】:

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


    【解决方案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 表中没有行的行是数字。

    【讨论】:

      【解决方案2】:

      CE 支持函数吗?您可以创建自己的 IsNuemric 函数(例如,一个简单的 char by char 解析器)并稍后在查询中调用它

      【讨论】:

        猜你喜欢
        • 2010-09-13
        • 1970-01-01
        • 2019-02-17
        • 2018-07-29
        • 1970-01-01
        • 2011-01-06
        • 1970-01-01
        • 1970-01-01
        • 2021-10-13
        相关资源
        最近更新 更多