Newsgroup: it.comp.lang.delphi
Titolo: SQL con parametri

Nello statement SQL che segue, vorrei parametrizzare le condizioni di 
estrazione, ma non so come fare nel caso dell'ANNO, che può essere, per 
esempio '2010,'2013','2015'. Per ora, uso il %, come segue:
 
WHERE (ANNO IN (%s)) and (BANCA=:dBanca) ....
 
C'è un modo di parametrizzare anche la lista di anni ?
Seconda domanda: c'è un modo, a parte sopprimere la condizione, di 
esprimerla in modo che funzioni anche quando gli anni si vogliono tutti ?
 
 
 
---
Questa e-mail è priva di virus e malware perché è attiva la protezione avast! Antivirus.
https://www.avast.com/antivirus
 
 

 esprimerla in modo che funzioni anche quando gli anni si vogliono tutti ?
 
1) purtroppo no. I parametri possono gestire solo valori
scalari, non consentono di gestire valori complessi, come liste
di valori.
 
2) Si e no. Con la IN l'unico modo e' di modificare il testo SQL.
Con i valori singoli puoi usare un trucco, che dipende
pero' dal dialetto SQL supportato dal tuo DB. Es. in MSSQL userei
... AND ( BANCA = isnull( :dBANCA, BANCA ) )
 
La funzione ISNULL restituisce il primo parametro se questo e' not null
mentre se il primo e' null restituisce il secondo.
 
In questo modo mettendo dBANCA a NULL ottieni di filtrare per tutte
le banche (equivale a "where banca=banca" ossia tutte le righe)
 
Altri DB usano altri nomi per la stessa funzionalita': oracle usa NVL
mysql credo usi ifnull, insomma dipende da cosa stai usando.
 
ultima cosa: e' possibile che la presenza di una funzione nella condizione
possa impattare sulle performance, anche quello dipende dal DB che usi.
 
ciao
Giacomo
 
 
 
 

"Giacomo Degli Esposti"  ha scritto nel messaggio 
news:ad657f12-5832-43be...@googlegroups.com...

-----
Ho un pò di ritegno a dirlo, ma uso il BDE e dBase, quindi un local SQL
Ok, rinuncio a parametrizzare gli Anni, ma speravo di potere usare un'unica 
stringa select per il calcolo di totali generali piuttosto che per la 
specifica banca. Ho fatto un esempio, ma di queste select ne ho tantissime e 
tentavo di unificarle.
Bello il trucco di MSSQL, ma non credo supportato dal DB che uso. Altre idee 


> ma non credo supportato dal DB che uso. 
 
Il "credo" lasciamolo ai cattolici.
Lo hai provato o no?
 
A.

 ... AND ( BANCA = isnull( :dBANCA, BANCA ) )
 
Giusto per completezza, aggiungo che molti db supportano anche Coalesce.
 
 
A.
 

"Alberto Salvati"  ha scritto nel messaggio 
news:f5aaf19c-6522-455e...@googlegroups.com...

--------------
L'ho provato: "Capability not supported" 


> L'ho provato: "Capability not supported" 
 
Ok. 
Ho conosciuto uno anni fa che usava una join su una tabella temporanea nella quale metteva una riga per ogni anno che gli interessava.
Onestamente io non l'ho mai fatto in quanto la ovvia (ma non per tutti) complessita' mi ha sempre fatto preferire il non usare una query parametrica.
Poi vedi tu, ma prima prova un po a immaginare come si fa e quali controindicazioni ha e condivi il tutto qua.
 
A.

 idee ?
 
Quello che farei io è di preparare la stringa SQL e passare quella senza 
parametri.
Cioè farei un preprocess iterando sui valori dei parametri e costruirei 
questa stringa:
WHERE (ANNO IN (2010,2011,2012)) and (BANCA IN ('BCA1','BPOP')) ....
e aggregheri l'output per banca o anni.
 
Devi per forza trovare un compromesso.
 
 
-- 
Morde

"Morde"  ha scritto nel messaggio news:mqkfh7$kfp$1...@speranza.aioe.org...
Quello che farei io è di preparare la stringa SQL e passare quella senza
parametri.
Cioè farei un preprocess iterando sui valori dei parametri e costruirei
questa stringa:
WHERE (ANNO IN (2010,2011,2012)) and (BANCA IN ('BCA1','BPOP')) ....
e aggregheri l'output per banca o anni.
 
Devi per forza trovare un compromesso.
-- 
Morde
-------------------------
Ok, rinuncio ai parametri e accetto questa soluzione ! Tentavo l'uso dei 
parametri perchè documentandomi mi avevano convinto che fosse una via più 
efficiente, ma naturalmente non sempre è possibile una soluzione integrale. 


 questa stringa:
 
Questo approccio e` quello che puo` portare piu` facilmente ad SQL injection, ed andrebbe evitato come la peste, a meno di non fare una "sanitisation" dei valori da concatenare.