与 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 ..)
关于雪花对空值的处理,我遇到了一些奇怪的事情。
我有一个中间查询可以过滤掉不合格的客户名称。我已将其缩小到 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 ..)