Newsgroup: it.comp.programmare
Titolo: ordinamenti SQL

avrei bisogno di ottenere l'ordinamento in un ResultSet in base
all'ordinamento delle selezioni di tipo OR di un determinato campo
ES.
select * from tabella where (campo1='C' or campo1='A' or campo1='F') 
ottenendo l'ordinamento su campo1 con C/A/F
è possibile nativamente SQL o devo gestirlo a programma??
un sorta di risalita!
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ottenendo l'ordinamento su campo1 con C/A/F
L'ordinamento puo' essere discendente o ascendente, e' possibile cambiare
la sequenza utilizzata, ma solo in fase di installazione del database
in quanto modifica in maniera permanente come sono costruiti gli indici.
Ma non capisco bene quale sia il tuo problema: se filtri su "C" o "A" o "F" 
otterrai solo questi valori, quindi potresti tranquillamente usare una group
by ed averli raggruppati (che credo sia quello che ti interessa).
Davide

dav...@yahoo.com
 wrote:

Una clausola ORDER BY permette agevolmente di sortare, ma l'ordine
sara` naturalmente quello alfabetico, prima A poi C poi F.  Non e`
difficile cambiare quest'ordine a seconda dell'RDBMS che usi -- al
momento non mi viene in mente una soluzione standard, ma e`
probabile che ne esista una.  Comunque ad esempio in MySQL faresti
    ORDER BY FIELD(campo1, "C", "A", "F")
la funzione FIELD torna 1 se campo` e` C, 2 se e` A, 3 se e` F, e
0 altrimenti, per cui l'ORDER BY produce il risultato che richiedi.
In PostgreSQL, analogamente, potresti fare:
    ORDER BY position(campo1 IN "CAF")
oppure:
    ORDER BY strpos(campo1, "CAF")
oppure:
    ORDER BY translate(campo1, "CAF", "ABC")
Anche qui, lo scopo e` comunque quello di tradurre "C" in qualcosa
di piu` piccolo, "A" in qualcosa d'intermedio, "F" in qualcosa di
piu` grosso, cosi` che ORDER BY lavori come noi vogliamo.
Se ti serve la portabilita` fra diversi motori SQL e non puoi
contare su nessuna funzione di traduzione piu` o meno standard
disponibile su tutti i motori, puoi comunque costruirtela tu
con una piccola tabella ausiliaria e un join!  "A braccio",
quindi scusa eventuali errori di sintassi...:
CREATE TEMP TABLE sortaux (scampo1 char(1) PRIMARY KEY, sortas integer);
INSERT INTO sortaux VALUES('C', 1);
INSERT INTO sortaux VALUES('A', 2);
INSERT INTO sortaux VALUES('F', 3);
Poi nel SELECT aggiungi ,sortaux alle tavole da cui vuoi
selezionare, AND campo1=scampo1 alle condizioni del WHERE,
e finalmente puoi usare "ORDER BY sortas" per sortare come
preferisci.  Penso che per il tuo caso particolare ci siano
metodi piu` semplici e lineari, ma un approccio del genere,
con tabelle ausiliarie, merita comunque tenerlo a mente
perche` in certi casi e` la soluzione piu` rapida a problemi
(magari di ordinamento) anche assai piu` complessi.
Alex

 Davide
si mi ricordo anch'io che su DB2 si potevano creare indici con specifiche
sequenze di ordinamento(mi ero salvato il posteriori con l'anno 2000), ma
non è questo il mio caso;
io devo selezionarne uno solo dei record risultanti(potrei utilizzare
anche un distinct), quello che conta è il CRITERIO DI RISALITA dato da
campo1 in clausola OR.
-------------------------------------------------------
Il mio scopo era evitare n statement SQL del tipo:
select * from tabella where campo1='C' 
select * from tabella where campo1='A'
select * from tabella where campo1='F'
per ricercare il primo disponibile
--------------------------------------------------------
forse potrei riuscirci mettendo lo stesso file in JOIN, ma mi sa che è
come fare n statement SQL
grazie comunque


 Alex
era quello che intendevo; il problema è che lavoro in java e non vorrei
segarmi la portabilità proprio sul database. Al momento lavoro anch'io su
MySql e proverò di sicuro l'interessante funzione FIELD.
La tabella temporanea messa in JOIN è performante se dovessi avere il file
principale con diciamo 1 milione di record??
ciao


 come fare n statement SQL
Ho dato un occhio in rete a come fare sui diversi motori SQL, e pare
che un modo portatile fra tutti non ci sia, ma ogni motore ha il
modo suo.  Se sai su che motore giri, sei a posto...:
- Oracle, "Access" (Jet), e pare anche MySQL:
    ORDER BY INSTR('CAF', campo1)
- PostgreSQL, come gia` avevo suggerito:
    ORDER BY POSITION(campo1 IN 'CAF')
oppure
    ORDER BY strpos(campo1, 'CAF')
- MS SQL Server:
    ORDER BY CHARINDEX(campo1, 'CAF')
Magari trovi anche un modo portabile -- ad es. non ricordavo, cosi`
a braccio, che INSTR funziona anche in MySQL, quindi nel mio ultimo
post suggerivo un approccio diverso (benche` analogo) per MySQL
basato invece su FIELD (sempre in ORDER BY, naturalmente).  Magari
INSTR o CHARINDEX o STRPOS o che cavolo d'altro gira su tutti i motori
SQL che devi supportare...?
Alex

 principale con diciamo 1 milione di record??
Si`, se il tuo motore RDBMS e` appena appena decente, le prestazioni
con la tabella ausiliaria (naturalmente e implicitamente indiciata
sulla sua PRIMARY KEY, che e` appunto quella su cui lavori!) di
appena tre record, dovrebbero essere eccellenti.  Puoi anche aiutare
il tuo motore ad ottimizzare anche meglio perche` l'OR non serve
piu`: basta appunto la presenza del valore di campo1 nella tabella
secondaria!  Questo e` difficile da capire per un ottimizzatore (che
non sa che le due condizioni coincidono), quindi, una volta che
hai preparato la tabella ausiliaria come da mio post precedente:
SELECT * 
FROM tabella, sortaux
WHERE campo1 = scampo1
ORDER BY sortas
dovrebbe essere tutto quel che ti serve.  Naturalmente, se hai
un indice su tabella.campo1 vai meglio (!), ma questo si applica
anche al tuo iniziale SELECT dove il WHERE e` un OR.  Anzi, non
mi stupirei se alcuni ottimizzatori fossero in grado di trattare
meglio questo SELECT che ti propongo io, perche` la tipica
condizione di JOIN usata in questo WHERE e` proprio la prima
cosa che un qualsiasi ottimizzatore va ad esaminare...!
Alex

se la funzione esiste su tutti i principali database posso anche pensare
di utilizzarla dato che ne gestisco l'accesso in un unico punto.
Farò qualche prova per vedere se supporta anche campi multipli
ES. order by FUNZ(campo1, 'CAF'), FUNZ(campo2, 'SPG') etc.
grazie


 ES. order by FUNZ(campo1, 'CAF'), FUNZ(campo2, 'SPG') etc.
Su questo non dovrebbero esserci problemi.
Alex