2010-11-26 29 views
3

tri champ dans Alphanumeric CE SQL (Compact Edition) version 3.5tri champ Alphanumérique dans SQL CE (Compact Edition) version 3.5

TreeNumber est un champ nvarchar avec un mélange de chiffres et de chaînes pour les valeurs. Je veux trier ces enregistrements afin que les enregistrements qui contiennent des caractères alpha soient en haut et les autres sont triés par ordre numérique.

Je veux quelque chose de similaire à la requête suivante qui fonctionne dans SQL Server:

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

La requête ci-dessus ne semble pas fonctionner parce que le [] gamme ne sont pas pris en charge dans CE. Une autre solution qui fonctionne avec SQL Server, mais ne fonctionne pas dans CE parce que « IsNumber() » est pas prise en charge est inférieure à:

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

Répondre

1

Ok, cette solution est moche, et pas pour les faibles de cœur. Je n'ai pas testé sur SQL CE, mais il utilise seulement t-sql de base donc ça devrait aller. Vous devrez créer un tally table (il suffit de lancer son premier bloc de code, si vous ne voulez pas le lire, il utilise le tempdb donc vous voudrez le changer), et un tableau pour contenir chaque lettre de l'alphabet (en raison du manque de fonctions de correspondance de motifs). Après avoir créé la table de pointage (vous n'avez pas besoin d'aller jusqu'à 11000 comme le montre l'exemple), lancez-les et vous verrez le comportement de tri que vous voulez

Créer la table de l'alphabet (temp à des fins de démonstration):

select * 
into #alphatable 
from 
(

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

Créer une table d'arbre (température à des fins de démonstration):

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 

La solution:

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 

Il s'agit essentiellement de la technique décrite par Moden comme "Passage entre les caractères", puis chaque caractère est joint à la table alpha. Les lignes sans ligne dans le tableau alpha sont numériques.

1

sont des fonctions prises en charge dans CE? Vous pouvez créer votre propre fonction IsNuemric (un char facile par char parser, par exemple) et l'appeler plus tard dans votre requête