|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2003
Città: Modena
Messaggi: 4125
|
[SQL] problema select
Ho una tabella e vorrei creare una query che mi ritorna tutti record in cui certo campo numerico è minore di quello fornito dall'utente. Vorrei che l'utente potesse decidere se filtrare i dati secondo questo campo oppure no, immettendo il valore Null. D'altro canto molti record assumono valori null. Quindi come posso fare ad avere tutti i record se l'utente fornisse in input il valore null?
__________________
ho concluso felicemente con: masterGR, piantax, aragorn85, battalion75, lukas785, cagnulein, CaFFeiNe, josty,kabira85 e tanti altri |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
Devi essere un attimo piu specifico: in primis, che db stai usando?
Inoltre, per i record che nel db hanno il campo a NULL, vuoi che ti vengano restituiti o meno?
__________________
Il sole è giallo |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Ciao. Penso di avere capito il problema, che e' un problema classico.
Qualcosa del genere Supponendo che il parametro utente sia @NomeCol, relativo alla colonne NomeCol della tabella, Codice:
SELECT * FROM Tabella
WHERE (CASE WHEN @NomeCol IS NOT NULL THEN NomeCol ELSE 1 END <
CASE WHEN @NomeCol IS NOT NULL THEN @NomeCol ELSE 2 END)
Questo un abbozzo, migliorabile a seconda del dialetto SQL in questione. Ma per esperienza ti assicuro che se passi attraverso il query composition, ovvero comporre una query dinamicamente a seconda dei parametri utente inseriti, otterrai risultati comunque sempre migliori, evitando di fare impazzire l'ottimizzatore che altrimenti molto probabilmente restituirebbe un piano di esecuzione penoso. PS: Sistemi "moderni" come Hibernate o Linq2Entity sono facilmente pilotabili con il query composition, e restituiscono un SQL davvero buono.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Sep 2003
Città: Modena
Messaggi: 4125
|
Quote:
se io il parametro immesso dall'utente è NULL allora voglio mostrare tutti i record, se invece è diverso da NULL voglio mostrare tutti i record che nella colonna hanno il valore immesso dall'utente. Spero di essermi spiegato meglio
__________________
ho concluso felicemente con: masterGR, piantax, aragorn85, battalion75, lukas785, cagnulein, CaFFeiNe, josty,kabira85 e tanti altri Ultima modifica di serbring : 15-04-2010 alle 21:33. |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Sep 2003
Città: Modena
Messaggi: 4125
|
Quote:
__________________
ho concluso felicemente con: masterGR, piantax, aragorn85, battalion75, lukas785, cagnulein, CaFFeiNe, josty,kabira85 e tanti altri Ultima modifica di serbring : 15-04-2010 alle 21:38. |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Se l'utente inserisce un valore nel parametro @NomeCol, la clausola WHERE viene trasformata in WHERE NomeCol<@NomeCol Se invecve @NomeCol dovessere valere NULL, allora la clausola WHERE viene trasformata in WHERE 1<2 che e' sempre verificata, ed equivale ad ignorare la clausola stessa, ovvero estrarre tutti i record.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Sep 2003
Città: Modena
Messaggi: 4125
|
Quote:
__________________
ho concluso felicemente con: masterGR, piantax, aragorn85, battalion75, lukas785, cagnulein, CaFFeiNe, josty,kabira85 e tanti altri |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Sembra che ACCESS non supporti la clausola CASE (Quasi standard e supportata da tutti gli altri DB Relazionali)
Prova a vedere se riuesci a cavartela con IIF o con SWITCH Quote:
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Sep 2003
Città: Modena
Messaggi: 4125
|
Quote:
__________________
ho concluso felicemente con: masterGR, piantax, aragorn85, battalion75, lukas785, cagnulein, CaFFeiNe, josty,kabira85 e tanti altri |
|
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Jul 2008
Città: Reggio Emilia
Messaggi: 290
|
Funzionante in access:
Codice:
SELECT * FROM Tabella WHERE nomecampo<[inserisci valore] AND nomecampo2<[inserisci valore]; |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Sep 2003
Città: Modena
Messaggi: 4125
|
Quote:
Codice:
WHERE Switch ( [Forms]![Maschera]![combo_minpower] = "IS NULL", 2>1, [Forms]![Maschera]![combo_minpower] <> "IS NULL",Implement.[Min engine power (kW)]<[Forms]![Maschera]![combo_minpower] );
__________________
ho concluso felicemente con: masterGR, piantax, aragorn85, battalion75, lukas785, cagnulein, CaFFeiNe, josty,kabira85 e tanti altri |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Le clausole CASE erano 2, le clausole SWITCH dovranno essere 2...
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Sep 2003
Città: Modena
Messaggi: 4125
|
Quote:
__________________
ho concluso felicemente con: masterGR, piantax, aragorn85, battalion75, lukas785, cagnulein, CaFFeiNe, josty,kabira85 e tanti altri |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Fatto salvo che non so come vengono passati i parametri sotto Access, e supponendo che un parametro possa essere chiamato
@parametro io scriverei cosi'. Codice:
WHERE Switch ( @parametro = "IS NULL", 1, [Forms]![Maschera]![combo_minpower]) < Switch ( @parametro = "IS NULL", 2, @parametro)
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Aug 2004
Messaggi: 19356
|
Quote:
Ps: ma Oracle Express è valido? io lo avevo installato e disinstallato nel giro di mezz'ora non trovavo documentazione.
__________________
"Le statistiche sono come le donne lascive: se riesci a metterci le mani sopra, puoi farci quello che ti pare" Walt Michaels Ultima modifica di Hal2001 : 15-04-2010 alle 23:21. |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Lento, non e' neppure SQL Standard, se non fai attenzione puoi violare le Foreign Keys, e non e' free come si puo' pensare in quanto non liberamente ridistribuibile, a differenza di altri fratelli maggiori.
Per cointinuare, l'azienda che ora ne possiede i diritti, Oracle, ha un prodotto concorrente tra i suoi assett, che e' proprio il suo principale, quello che gli da' da mangiare. Non so quindi quanto possa essere spinto o supportato in futuro.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Aug 2004
Messaggi: 19356
|
Quote:
A proposito di Oracle, avevo scritto un Postum Scriptum sopra, magari dopo il tuo commento, mi piacerebbe sapere il tuo punto di vista. Comunque Mysql non morirà. Anzi, c'è parecchia carne sul fuoco: http://punto-informatico.it/2858278/...ql-innodb.aspx
__________________
"Le statistiche sono come le donne lascive: se riesci a metterci le mani sopra, puoi farci quello che ti pare" Walt Michaels |
|
|
|
|
|
|
#18 | |||
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Ci sono aggiunte, per fare aclune operazioni piu' comodamente (concetti peraltro diffusi in tutti i motori), ma le cose SQL92 standard sono sempre supportate. Quote:
Quindi la documentazione e' la stessa, e ce n'e' tanta da annegare. Quote:
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|||
|
|
|
|
|
#19 | ||
|
Senior Member
Iscritto dal: Sep 2003
Città: Modena
Messaggi: 4125
|
Quote:
Codice:
WHERE Switch ([Forms]![Maschera]![combo_maxpowe] IS NULL,[Forms]![Maschera]![combo_minpower]>0, [Forms]![Maschera]![combo_maxpowe] <> "IS NULL",[Max engine power (kW)]<[Forms]![Maschera]![combo_maxpowe] ); domanda tecnica: è possibile avere in un campo numerico un vettore? Perchè uno di questi campi può assumere due valori numerici contemporaneamente. Quote:
__________________
ho concluso felicemente con: masterGR, piantax, aragorn85, battalion75, lukas785, cagnulein, CaFFeiNe, josty,kabira85 e tanti altri Ultima modifica di serbring : 16-04-2010 alle 12:42. |
||
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:12.




















