与 where 相比,select 中的 snowflake 处理 null 的方式不同

snowflake treating null different in select compared to where

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

我有一个中间查询可以过滤掉不合格的客户名称。我已将其缩小到 where 子句。我有一些客户的合法名称为空,随后被 where 子句过滤掉。当我将此逻辑放入 select 时,它仍然是正确的。

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%'
                                            ,'%/%'
                                            ,'%LTD%'
                                            ,'%BKU%'
                                            ,'%TRUST%'
                                            ,'%CORP%'
                                            ,'%PERPETUAL%'
                                            ,'%LIMITED%'
                                            ,'%MORTGAGE%'
                                            ,'%POSSESSION%'
                                            ,'%EXERCISING%'
                                            ,'%EXECUTOR%'
                                            ,'%ESTATE%'
                                            ,'%LEGAL%'
                                            ,'%PERSONAL%'
                                            ,'%REPRESENT%'
                                            ,'%DECEASED%'
                                            ,'%PRINCIPAL
                                            ))

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

 where iff(legal_name is null, true, <the rest of the where clause above>)

我发现越来越多的实例表明 snowflake 对空值的处理与 MS 不同 SQL。

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

您的用例似乎符合规则“像 'a'=NULL、'a'>NULL 或 NULL=NULL 的相等或不等比较将始终 return NULL” .事实上:

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

不 return 正确。

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

确实 return 正确。 因此,您应该在查询中使用:

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