与 where 相比,雪花在选择中处理 null 不同

问题描述

关于雪花对空值的处理,我遇到了一些奇怪的事情。

我有一个过滤掉不合格客户名称的中间查询。我已将其范围缩小到 where 子句。我有一些客户的合法名称为空,随后被 where 子句过滤掉。当我将此逻辑放入选择中时,它仍然显示为 true。

import numpy as np
a = np.array([0,1,1])
b = np.array([1,1])

我错过了什么吗?其他人也发现这个吗? 有没有不同的方式可以说明我的 where 子句?我正在考虑使用

select
v.legal_name,not(iff(upper(v.legal_name) like any ('%PTY%','%LTD%','%BKU%','%TRUST%','%CORP%','%PERPETUAL%','%LIMITED%','%MORTGAGE%','%POSSESSION%','%EXERCISING%','%EXECUTOR%','%ESTATE%','%LEgal%','%PERSONAL%','%rEPRESENT%','%DECEASED%','%PRINCIPAL%'),true,false)) as test_legal_name

 from clients


 where not(upper(v.legal_name) like any ('%PTY%','%/%','%PRINCIPAL
                                            ))

我发现越来越多的情况下,sNowflake 对空值的处理很古怪且与 MS sql 不同。

解决方法

请查看这篇文章:https://community.snowflake.com/s/article/NULL-handling-in-Snowflake

您的用例似乎属于规则“等式或不等式比较,如 'a'=NULL、'a'>NULL 或 NULL=NULL 将始终返回 NULL”。事实上:

SELECT True AS Is_Not_Like_Any
WHERE NOT (NULL LIKE ANY ('%A%','%B%'));

不返回 True。

SELECT True AS Is_Not_Like_Any 
WHERE NOT (IFNULL(NULL,'') LIKE ANY ('%A%','%B%'));

确实返回 True。 因此,您应该在查询中使用:

WHERE NOT(UPPER(IFNULL(v.legal_name,'') ) LIKE ANY ..)