sqlite3, qmarks, and NULL values

Jean-Michel Pichavant jeanmichel at sequans.com
Wed May 20 08:56:38 EDT 2009

I fall into the same issue when using postgres. Your main concern is 
that NULL = NULL will return False. Could seems strange but it has much 
advantages sometimes, however this is not the purpose.
I found your solution quite acceptable. Just replace 'if y:' by 'if y is 
None:', add a comment to point that #NULL <> NULL to help any reader 
that is not familiar with db and you got a perfectly readable code.

Of course if you have more complex queries to build you'll have to think 
about an elegant way to manage NULL values. I personally iterate trough 
all my COLs and add a 'COL# = ?' if the value queried is not None. It 
works, it's readable, it's simple, it's python :o)


Mitchell L Model wrote:
> Suppose I have a simple query in sqlite3 in a function:
>     def lookupxy(x, y):
>         conn.execute("SELECT * FROM table WHERE COL1 = ? AND COL2 = ?",
>                      (x, y))
> However, COL2 might be NULL. I can't figure out a value for y that would retrieve rows for which COL2 is NULL. It seems to me that I have to perform an awkward test to determine whether to execute a query with one question mark or two.
>     def lookupxy(x, y):
>         if y:
>             conn.execute("SELECT * FROM table WHERE COL1 = ? AND COL2 = ?",
>                          (x, y))
>         else:
>             conn.execute("SELECT * FROM table WHERE COL1 = ? AND COL2 IS NULL",
>                          (x,))
> The more question marks involved the more complicated this would get, especially if question marks in the middle of several would sometimes need to be NULL. I hope I'm missing something and that someone can tell me what it is.

More information about the Python-list mailing list