ORDER BY cint(RIGHT(Campo, 4))

giovedì 18 gennaio 2007 - 11.29

memmo77 Profilo | Expert

Salve. Dovrei fare una select su un bd ed ordinrla per un campo ti tipo string ma trattandolo come un integer, una cosa del genere...che non funziona logicamente

SELECT *
FROM Matrici_DizCampi
ORDER BY cint(RIGHT(Campo, 4))

come si fa sotto sql?
Grazie a tutti

alx_81 Profilo | Guru

>Salve.
Ciao!

>Dovrei fare una select su un bd ed ordinrla per un campo
>ti tipo string ma trattandolo come un integer, una cosa del genere...che
>non funziona logicamente
>
>SELECT *
>FROM Matrici_DizCampi
>ORDER BY cint(RIGHT(Campo, 4))

SQL Server ti da errore poichè la CINT non esiste, ma utilizzando CAST o CONVERT, funziona..
Diciamo che devi essere sicuro al 100% che il valore ricavato sia una serie di caratteri numerici, altrimenti l'istruzione genera un'eccezione di casting..
eccoti un esempio:

CREATE TABLE #Matrici_DizCampi ( Id int identity(1,1) PRIMARY KEY CLUSTERED, Campo varchar(10) ) INSERT #Matrici_DizCampi SELECT 'asdfas2345' INSERT #Matrici_DizCampi SELECT 'bsdfas0345' INSERT #Matrici_DizCampi SELECT 'csdfas7345' INSERT #Matrici_DizCampi SELECT 'xxdfas1345' INSERT #Matrici_DizCampi SELECT 'zzdfas3345' SELECT Id, Campo, ValoreOrdinato = CAST(RIGHT(Campo,4) AS INT) FROM #Matrici_DizCampi ORDER BY CAST(RIGHT(Campo,4) AS INT) DROP TABLE #Matrici_DizCampi

Comunque sia, se riesci a trovare un altro criterio di ordinamento, magari basato solo su un campo della tabella, e magari opportunamente indicizzato, non perdi prestazioni così come effettuare ordinamenti o raggruppamenti su funzioni sui campi..
Ciao!

>Grazie a tutti
Di nulla!

Alx81 =)

http://blogs.dotnethell.it/suxstellino

lbenaglia Profilo | Guru

>Comunque sia, se riesci a trovare un altro criterio di ordinamento,
>magari basato solo su un campo della tabella, e magari opportunamente
>indicizzato, non perdi prestazioni così come effettuare ordinamenti
>o raggruppamenti su funzioni sui campi..
Esatto. SQL Server 2005 ci permette di rendere persistenti le colonne calcolate e quindi è ora possibile indicizzarle.
In questo esempio definirò una colonna calcolata persistente a livello di tabella, definirò un indice clustered su di essa massimizzando le prestazioni di ordinamento, raggruppamento ed eventualmente di filtraggio tramite la clausola BETWEEN:

USE tempdb; CREATE TABLE dbo.Matrici_DizCampi( Id int IDENTITY(1, 1), Campo varchar(10) NOT NULL, Numero AS CAST(RIGHT(Campo, 4) AS int) PERSISTED, CONSTRAINT PK_Matrici_DizCampi PRIMARY KEY NONCLUSTERED (Id) ); CREATE CLUSTERED INDEX CL_IDX_Numero ON dbo.Matrici_DizCampi(Numero); INSERT dbo.Matrici_DizCampi VALUES('asdfas2345'); INSERT dbo.Matrici_DizCampi VALUES('bsdfas0345'); INSERT dbo.Matrici_DizCampi VALUES('csdfas7345'); INSERT dbo.Matrici_DizCampi VALUES('xxdfas1345'); INSERT dbo.Matrici_DizCampi VALUES('zzdfas3345'); SELECT Id, Campo, Numero FROM dbo.Matrici_DizCampi ORDER BY Numero; /* Output: Id Campo Numero ----------- ---------- ----------- 2 bsdfas0345 345 4 xxdfas1345 1345 1 asdfas2345 2345 5 zzdfas3345 3345 3 csdfas7345 7345 (5 row(s) affected) */ DROP TABLE dbo.Matrici_DizCampi

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

alx_81 Profilo | Guru

>Esatto. SQL Server 2005 ci permette di rendere persistenti le
>colonne calcolate e quindi è ora possibile indicizzarle.
Ciao Lorenzo.
Ho visto, anche all'ultimo workshop di UGISS, un esempio simile. E' stato creato l'indice su una colonna calcolata, ma gli speaker non hanno utilizzato l'opzione PERSISTED.
Cosa cambia rendere la colonna persistente?
Alx81 =)

http://blogs.dotnethell.it/suxstellino

lbenaglia Profilo | Guru

>Cosa cambia rendere la colonna persistente?
Che viene calcolata una volta sola all'atto dell'insert (o update) e poi resa persistente nella tabelle come se fosse una normalissima colonna.
Inoltre PERSISTED ti permette di definire indici su colonne la cui espressione risulta deterministica ma imprecisa.

Trovi tutto descritto per benino nel seguente paragrafo dei Books Online:

"Creating Indexes on Computed Columns"
http://msdn2.microsoft.com/en-us/library/ms189292.aspx

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

alx_81 Profilo | Guru

grazie mille!
ciao!
Alx81 =)

http://blogs.dotnethell.it/suxstellino
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5