Frage

Sortierung alphanumerisches Feld in SQL CE (Compact Edition) Version 3.5

TreeNumber ist ein nvarchar Feld mit einer Mischung aus Zahlen und Strings für die Werte. Ich möchte diese Datensätze sortieren, so dass die Datensätze, die Alpha-Zeichen sind an der Spitze und dem Rest enthalten, sind in numerischer Reihenfolge sortiert.

Ich möchte etwas Ähnliches wie die folgende Abfrage, die in SQL Server funktioniert:

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

Die obige Abfrage scheint nicht zu funktionieren, weil die [] Bereich nicht in CE unterstützt wird. Eine andere Lösung, die mit SQL Server funktioniert, aber funktioniert nicht in CE, weil „IsNumber ()“ wird nicht unterstützt, ist unter:

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

Lösung

Ok, diese Lösung ist hässlich, und nicht für schwache Nerven. Ich habe nicht auf SQL CE geprüft, aber es nutzt nur grundlegenden T-SQL, also sollte es in Ordnung sein. Hier finden Sie eine tally Tabelle (nur laufen seinen ersten Codeblock erstellen müssen wenn Sie es nicht lesen wollen. es die tempdb verwendet, so dass Sie das) ändern möchten werden, und eine Tabelle, die jeden Buchstaben des Alphabets (aufgrund des Fehlens von pattern-Matching-Funktionen) zu halten. Nach der Tally-Tabelle erstellen (Sie müssen den ganzen Weg bis 11000, wie das Beispiel zeigt nicht gehen), führen Sie diese, und Sie werden das Sortierverhalten Sie

siehe

Erstellen Sie das Alphabet Tabelle (Temp für Demozwecke):

select *
into #alphatable
from
(

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

Erstellen Sie eine Baumtabelle (Temp für Demozwecke):

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

Die Lösung:

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 

Dies ist im Grunde die Technik, die Moden als „Stepping durch die Zeichen“ beschreiben, wird jedes Zeichen in der alpha-Tabelle verbunden ist. Zeilen ohne Zeile in der Tabelle sind numerische alpha.

Andere Tipps

Sind Funktionen in CE unterstützt? Sie könnten Ihre eigene IsNuemric Funktion (eine einfache char von char-Parser, zum Beispiel) und nennen Sie es später in der Abfrage

machen
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top