我没有使用完整的DB Abstraction库,并且在psycopg2中使用的原始sql模板如下所示:
SELECT id FROM table WHERE message = %(message)s ;
检索我的预期结果的理想查询如下所示:
SELECT id FROM table WHERE message = 'a3cbb207' ;
SELECT id FROM table WHERE message IS NULL ;
不幸的是......显而易见的问题是我的NULL比较看起来像这样:
SELECT id FROM table WHERE message = NULL ;
...这不是正确的比较 - 并没有给我预期的结果集。
我的实际查询比上面的插图复杂得多 - 因此我无法轻易更改它们。 (这是正确的解决方案,我同意。我现在正在寻找紧急修复方案)
有没有人知道一种解决方法,所以我可以保持相同的单一模板,直到适当的修复到位?我试图让coalesce
和/或cast
工作,但我尝试了一下。
答案 0 :(得分:11)
你想要的是IS NOT DISTINCT FROM
。
SELECT id FROM table WHERE message IS NOT DISTINCT FROM 'the text';
SELECT id FROM table WHERE message IS NOT DISTINCT FROM NULL;
NULL IS NOT DISTINCT FROM NULL
是true
,而不是NULL
,所以它就像=
但具有不同的NULL
比较语义。非常棒的触发功能。
虽然AFAIK不能使用IS DISTINCT FROM
进行索引查找,但请注意。最好对null和value使用单独的测试。
答案 1 :(得分:1)
不幸的是,NULL
实际上并不等于任何内容(甚至不是NULL
},因为NULL
的值旨在表示 unknown 。您最好的选择是更改模板以正确处理此问题。
如果您可以为模板中的左右操作数传递单独的值,那么仍然使用等号的一种方法是:
SELECT id FROM table WHERE true = (message is null);
答案 2 :(得分:1)
您可以尝试编写查询子句,如下所示:
WHERE message = %(message)s OR ((%message)s IS NULL AND message IS NULL))
它有点粗糙,但它意味着“选择与我的参数匹配的消息,或者如果我的参数为空则选择所有消息为null”。应该这样做。