以下是在python sqlite3上测试的,但它应该可以在其他数据库类型中使用,因为它非常通用。这个方法和@MoshiBin的答案一样,有一些增加:
这里是使用光标的表单。执行()常规语法,所以在使用这种形式,不支持空变量:
import sqlite3
conn = sqlite3.connect('mydbfile.db')
c = conn.cursor()
c.execute('SELECT * FROM TestTable WHERE colname = ?', (a,))
为了支持空变量,你可以更换4号线:
request = 'SELECT * FROM TestTable WHERE colname %s' % ('= ' + str(a) if a else 'IS NULL')
c.execute(request)
另外,如果变量是文本类型,还需要包括引号:
request = "SELECT * FROM TestTable WHERE colname %s" % ("= '" + a + "'" if a else 'IS NULL')
Finaly如果一个变量可以包含一个单引号本身,还需要加倍逃脱它:
request = "SELECT * FROM TestTable WHERE colname %s" % ("= '" + a.replace("'", "''") + "'" if a else 'IS NULL')
编辑:
最近我发现,也可以在这种情况下使用,使用常规cursor.execute()语法其他两种方法,但是我现在这个的人我以前不测试:
c.execute('SELECT * FROM TestTable WHERE colname = :1 OR (:1 IS NULL AND colname IS NULL)', {'1': a})
(Thx至@BillKarwin answer)
,或者使用CASE表达式:
c.execute('SELECT * FROM TestTable WHERE CASE :1 WHEN NOT NULL THEN colname = :1 ELSE colname IS NULL END', {'1': a})
这是一个很好的简单解决方案,工作正常。非常感谢! – JamieH 2009-06-30 14:33:36