在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)
;
使用第一段代码,结果是一个包含多行的表,第一行是空字符串。
第二段代码按预期工作
这有什么原因吗?
答案 0 :(得分:4)
所以不同的是,如果没有WHERE子句,你不会限制你选择的内容,IE会考虑每一行。 CASE语句可以按标准存储项目,但是您不会因为存储桶没有捕获所有内容而丢失结果,因此NULL。 WHERE限制返回的项目。
答案 1 :(得分:0)
是的,第一个在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
计算字段)。
答案 2 :(得分:0)
您的第一个查询不正确,'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
;
可能你有NULL值,因为'case'子句没有默认值,所以对于不符合条件的值,它返回NULL。 'case'子句和'NOT IN'之间有区别,第一个返回所有行,但没有值,不符合条件,第二个查询只返回满足条件的行。