以下是在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