我正在使用使用sqlite3 for Python存储地址的数据库。我们了解您使用?
作为占位符,并且为execute
方法提供了一个元组或值列表来填充占位符。我还知道None
应该与sqlite的NULL
值相对应。
但是,如果我尝试像这样从表中SELECT
,即使该条目确实存在于表中,它也不会获取任何值:
cursor.execute('SELECT * FROM test WHERE (address, apartment, city, state) = (?, ?, ?, ?);',
('123 Front St', None, 'Springfield', 'WA'))
但是,如果该公寓不是一个NULL
值,并且我给它指定了公寓的常规旧字符串,则可以很好地获取它。
我在做什么错了?
答案 0 :(得分:2)
您可以重写查询以确保NULL
的安全:
-- ISO-standard
SELECT *
FROM test
WHERE address IS NOT DISTINCT FROM ?
AND apartment IS NOT DISTINCT FROM ?
AND city IS NOT DISTINCT FROM ?
AND state US NOT DISTINCT FROM ?;
-- SQLite
SELECT *
FROM test
WHERE (address = ? OR ? IS NULL)
AND (apartment = ? OR ? IS NULL)
...
在SQL世界中,col = NULL
产生的Unknown与true不同。
相关:what is “=null” and “ IS NULL