使用可以为null的列测试不等式

rou*_*ble 12 sql database null informix nullable

所以,今天早上我问了一个问题,我没有正确说出,所以我得到了很多回复,为什么NULL与任何东西相比都会给出NULL/FALSE.

我的实际问题是,对于两个可以为NULL的两列测试不平等的方式,时间是多少.我的问题与这个问题恰恰相反.

要求如下,A和B是两列:
a)如果A和B都是NULL,它们是相等的,返回FALSE
b)如果A和B都不是NULL,则返回A <> B
c) A或B为NULL,它们不相等,返回TRUE

Tom*_*m H 10

根据数据类型和列的可能值:

COALESCE(A, -1) <> COALESCE(B, -1)
Run Code Online (Sandbox Code Playgroud)

诀窍是找到一个永远不会出现在数据中的值(这里我用-1).

另一种方式是:

(A <> B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL)
Run Code Online (Sandbox Code Playgroud)

这可能是一个问题,具体取决于您的特定RDBMS如何处理NULL.根据ANSI标准,这应该给你你想要的,但无论如何谁遵循标准.:)

PS - 我还应该指出,使用COALESCE函数可能会在比较列时使索引无效.检查查询计划和查询的性能,看看是否存在问题.

PPS - 我刚注意到OMG Ponies提到Informix不支持COALESCE.这是我认为的ANSI标准功能,但请看我上面谈到的关于标准的内容......