选择具有空比较的项目

时间:2012-08-18 00:53:48

标签: postgresql psycopg2

我没有使用完整的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工作,但我尝试了一下。

3 个答案:

答案 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 NULLtrue,而不是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”。应该这样做。