Question

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

TreeNumber est un champ nvarchar avec un mélange de chiffres et de chaînes pour les valeurs. Je veux trier ces documents afin que les enregistrements qui contiennent des caractères alpha sont en haut et le reste 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 la 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
Était-ce utile?

La solution

Ok, cette solution est laid, et non pas pour les faibles de cœur. Je ne l'ai pas testé sur SQL CE, mais il utilise seulement t-sql de base, il devrait être correct. Vous devrez créer une table tally (il suffit d'exécuter son premier bloc de code , si vous ne voulez pas lire. il utilise le tempdb donc vous aurez envie de changement), et une table de tenir chaque lettre de l'alphabet (en raison du manque de fonctions de correspondance de motif). Après avoir créé la table de pointage (vous ne devez pas aller tout le chemin à 11000 comme le montre par exemple), exécutez ceux-ci, et vous verrez le comportement de tri que vous voulez

Créez la table alphabétique (temp pour démonstration fins):

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 pour démonstration fins):

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 

Ceci est essentiellement la technique qui Moden décrit comme « pas à pas à travers les personnages », chaque caractère est rejoint sur la table alpha. Les lignes dont aucune ligne dans la table d'alpha sont numériques.

Autres conseils

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top