在SAS中
我有一个proc-sql步骤,用来创建宏变量来执行一些列表处理。
我遇到了一个令人困惑的步骤,使用case语句而不是where语句会导致结果数据集的第一行是空字符串('')
这两个表中的任何一个字段中都没有包含空字符串。
以下是两个示例SQL步骤,为了简单起见,去掉了所有的宏业务:
create table test as
select distinct
case
when brand in (select distinct core_brand from new_tv.core_noncore_brands) then brand
end as brand1
from new_tv.new_tv2
;
create table test2 as
select distinct brand
from new_tv.new_tv2
where brand in (select distinct core_brand from new_tv.core_noncore_brands)
;
使用第一段代码,结果是一个包含多行的表,第一行是一个空字符串。
第二段代码按预期工作
这有什么原因吗?
发布于 2013-06-03 23:43:42
所以不同的是,如果没有WHERE子句,你不会限制你选择的内容,IE会考虑每一行。CASE语句可以根据条件存储项,但不会因为存储桶不能捕获所有内容而丢失结果,因此结果为NULL。WHERE限制返回的项。
发布于 2013-06-03 23:36:48
是的,第一个在case语句中没有then
子句。令我惊讶的是,它甚至可以解析。在很多SQL方言中都不会这样。
你的意思大概是:
create table test as
select distinct
case
when brand in (select distinct core_brand from new_tv.core_noncore_brands)
then brand
end as brand1
from new_tv.new_tv2
;
您得到NULL的原因是,对于不匹配的品牌,case
语句是返回NULL。您需要添加:
where brand1 is not NULL
为了防止这种情况(使用子查询或使brand1
成为计算字段)。
发布于 2013-06-03 23:39:45
您的第一个查询不正确,'case‘子句中没有'then’语句。
create table test as
select distinct
case
when brand in (select distinct core_brand from new_tv.core_noncore_brands)
*then value*
end as brand1
from new_tv.new_tv2
;
您可能会有空值,因为'case‘子句没有默认值,所以对于不满足条件的值,它返回NULL。“case”子句和“not IN”子句是不同的,第一个子句返回所有行,但不返回不满足条件的值,而第二个查询只返回满足条件的行。
https://stackoverflow.com/questions/16900404
复制相似问题