我们正在使用一个使用合并的查询来比较潜在的空值。我想摆脱这种情况,因为它不仅使查询更难维护,而且非常难看。想象一下:
where coalesce(tbl1.field,'~') <> Coalesce(tbl2.field,'~')
...在 where 子句中重复 30 多次。哎呀。
我一直以为 EXISTS 可以让我绕过这种笨拙,但事实证明我错了。
最好的替代方法是将合并后的值作为列默认值驱动到物理数据模型中,而不是 NULL。这要求企业接受并理解令牌值将在数据模型中替换为企业当前接受 NULL 表示的任何内容。NULL 的棘手之处有时是在元数据和逻辑数据模型中准确描述 NULL 代表什么。从纯粹主义者的角度来看,不应该允许它表示多种事物。其他替代方法是解决 NULL 不能与另一个值(NULL 或非 NULL)进行比较的事实。
COALESCE 在 Teradata(以及其他数据库)中被视为内联 CASE 语句。WHERE 子句中有大量 COALESCE 语句的问题是优化器可能无法准确估计结果基数,因为 COALESCE 允许进行两次以上的比较。COALESCE(A.Col1, B.Col2, C.Col3, '~')
将返回它遇到的第一个非 NULL 值。
如果 NULLS 是参考表在其域中没有 NULL 值的维度,则可以将其排除在考虑之外。换句话说,NULL 不是有效的主键。但是,您会在优化器中发现,它可能会在表中插入一个条件,在该表中允许 NULLS 仅假脱机那些A.Col1 IS NOT NULL
. 因此,在您的数据模型中允许使用 NULL 会产生一些开销。
我总是使用 CASE 语句。它更清晰。NULLS 搞砸了一切。我想它们是必要的,但我发现它们通常可以被消除。我们的数据建模师说“朋友不要让朋友使用 NULL。我喜欢这样。