Ce qui suit a été testé sur python sqlite3 maintenant, mais il devrait fonctionner dans d'autres types de DB car il est assez général. L'approche est la même pour @MoshiBin répondre avec quelques ajouts:
Voici la forme en utilisant le curseur.execute() syntaxe régulière, de sorte que les variables nulles ne sont pas pris en charge en utilisant ce formulaire:
import sqlite3
conn = sqlite3.connect('mydbfile.db')
c = conn.cursor()
c.execute('SELECT * FROM TestTable WHERE colname = ?', (a,))
Afin de soutenir les variables nulles que vous pouvez remplacer la 4e ligne:
request = 'SELECT * FROM TestTable WHERE colname %s' % ('= ' + str(a) if a else 'IS NULL')
c.execute(request)
En outre, si la variable est dans le type de texte, vous devez également inclure un devis:
request = "SELECT * FROM TestTable WHERE colname %s" % ("= '" + a + "'" if a else 'IS NULL')
Finaly si une variable peut contenir un seul se guillemets, vous devez également y échapper en doublant:
request = "SELECT * FROM TestTable WHERE colname %s" % ("= '" + a.replace("'", "''") + "'" if a else 'IS NULL')
Modifier:
Dernièrement, j'ai trouvé deux autres approches qui peuvent également être utilisés dans ce cas et utilise la syntaxe cursor.execute() régulière, mais je did't tester ce les maintenant:
c.execute('SELECT * FROM TestTable WHERE colname = :1 OR (:1 IS NULL AND colname IS NULL)', {'1': a})
(Thx à @BillKarwin answer)
ou, en utilisant l'expression CASE:
c.execute('SELECT * FROM TestTable WHERE CASE :1 WHEN NOT NULL THEN colname = :1 ELSE colname IS NULL END', {'1': a})
C'est une bonne solution simple et fonctionne bien. Merci beaucoup! – JamieH