Proc Sql案例混乱

时间:2013-06-03 15:30:20

标签: sql sas

在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)
    ; 

使用第一段代码,结果是一个包含多行的表,第一行是空字符串。

第二段代码按预期工作

这有什么原因吗?

3 个答案:

答案 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'之间有区别,第一个返回所有行,但没有值,不符合条件,第二个查询只返回满足条件的行。