Teradata:如何在不使用coalesce的情况下比较潜在的空字段?

时间:2012-06-19 19:38:19

标签: null teradata coalesce

我们正在使用一个使用coalesce来比较潜在空值的查询。我想摆脱这种情况,因为它不仅使查询更难以维护,而且难以理解。想象一下:

where coalesce(tbl1.field,'~') <> Coalesce(tbl2.field,'~')

......在where子句中重复30次以上。哎呀。

我的印象是,EXISTS可以让我绕过这种琐事,但事实证明我错了。

2 个答案:

答案 0 :(得分:2)

最好的选择是将合并后的值作为列默认值替换为NULL来驱动物理数据模型。这要求业务接受并理解在数据模型中将替换令牌值,以用于当前业务接受NULL表示的任何内容。有关NULL的棘手问题有时会在元数据和逻辑数据模型中准确地描述NULL表示的内容。从纯粹主义的角度来看,不应该允许它意味着多件事。其他替代方法是解决以下事实:NULL无法与另一个值进行比较,NULL或非NULL。

COALESCE被视为Teradata(以及其他数据库)中的内联CASE语句。 WHERE子句中的大量COALESCE语句的问题在于优化器可能无法准确地估计得到的基数,因为COALESCE允许进行两次以上的比较。 COALESCE(A.Col1, B.Col2, C.Col3, '~')将返回它遇到的第一个非NULL值。

如果NULLS是参考表在其域中没有NULL值的维度,则可以将NULLS排除在外。换句话说,NULL不是有效的主键。但是,您会在优化器中发现它可能会在表中插入一个条件,允许NULLS仅对那些A.Col1 IS NOT NULL的记录进行假脱机。因此,在数据模型中允许使用NULL会产生一些开销。

答案 1 :(得分:0)

我总是使用CASE语句。它更加清晰。 NULLS搞砸了一切。我猜他们是必要的,但我发现他们通常可以被淘汰。我们的数据建模师说:“朋友不要让朋友使用NULL。我喜欢这样。