Domanda

campo Ordinamento alfanumerico in SQL CE (Compact Edition) versione 3.5

TreeNumber è un campo nvarchar con un mix di numeri e stringhe per i valori. Voglio ordinare questi record in modo che i record che contengono alfa caratteri sono in cima e il resto sono ordinati in ordine numerico.

Voglio qualcosa di simile alla seguente query che funziona in SQL Server:

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

La query di cui sopra non sembra funzionare perché la gamma [] non è supportato in CE. Un'altra soluzione che funziona con SQL Server, ma non funziona in CE perché "ISNUMBER ()" non è supportato è qui sotto:

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

Soluzione

Ok, questa soluzione è brutto, e non per i deboli di cuore. Non ho ancora testato su SQL CE, ma utilizza solo di base di T-SQL e quindi dovrebbe essere ok. Si dovrà creare una conteggio tavolo (basta eseguire il suo primo blocco di codice , se non si vuole leggere. esso utilizza il tempdb in modo ti consigliamo di cambiamento che), e un tavolo di tenere ogni lettera dell'alfabeto (a causa della mancanza di funzioni di pattern matching). Dopo aver creato la tabella di conteggio (non c'è bisogno di andare fino in fondo a 11000 Come mostra l'esempio), esegue questi, e vedrete il comportamento di ordinamento che si desidera

Creare la tabella di alfabeto (temp per demo scopi):

select *
into #alphatable
from
(

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

Creare una tabella albero (temp per demo scopi):

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 soluzione:

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 

Questo è fondamentalmente la tecnica che Moden descrive come "Potenziamento attraverso i caratteri", allora ogni carattere è unito sulla tavola alfa. Righe con nessuna riga nella tabella alfa sono numerici.

Altri suggerimenti

sono funzioni supportate in CE? Si potrebbe fare una propria funzione IsNuemric (un char facile da char parser, per esempio) e chiamare in un secondo momento nella query

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top