1

我没有使用完整的 DB 抽象库,而是在 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工作,但我的尝试失败了。

4

3 回答 3

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 NULLis true, not NULL,所以它就像=但具有不同的NULL比较语义。触发功能很棒。

不过, AFAIK 不能IS DISTINCT FROM用于索引查找,所以要小心。对 null 和 value 使用单独的测试会更好。

于 2012-08-18T01:52:29.257 回答
1

不幸的是,NULL实际上并不等于任何东西(甚至不等于另一个NULL),因为 的值NULL旨在表示一个unknown。您最好的选择是更改您的模板以正确处理此问题。

如果您可以在模板中为左右操作数传入单独的值,则仍然使用等号的一种方法是:

SELECT id FROM table WHERE true = (message is null);
于 2012-08-18T00:59:27.773 回答
1

您可以尝试如下编写查询子句:

WHERE message = %(message)s OR ((%message)s IS NULL AND message IS NULL))

这有点粗略,但它的意思是“选择与我的参数匹配的消息,或者如果我的参数为空,则选择所有为空的消息”。它应该可以解决问题。

于 2012-08-18T01:06:41.257 回答