2013-06-03 60 views
0

SAS内部Proc SQL案例混淆

我有一个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) 
    ; 

,第一个是一个空字符串。

第二段代码按预期工作

有什么理由为此?

回答

4

所以不同之处在于,如果没有WHERE子句,你并不限制你选择的是什么,IE每行都被考虑。 CASE语句可以按条件对项目进行存储,但不会因为您的存储桶不捕获所有内容而丢失结果,因此不会执行NULL。在哪里限制正在返回的物品。

+0

这个问题所以null基本上是行的结果,这些行不属于true,并且返回一个空字符串,因为我没有ELSE? – scott

+0

的确,它们仍然被选中,因为它们不被WHERE标准排除。由于它们不符合CASE标准,因此它们为NULL,您可以通过ELSE或其他WHEN/THEN方式在CASE语句中给它们一个不同的值,或者在WHERE标准中限制它们。 –

+0

真棒,谢谢 – scott

0

是的,第一个在案件陈述中没有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计算字段)。

+0

对不起,这是一个复制错误,在我的实际代码中有一个then子句,更新了 – scott

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值,因为没有为“案例”条款没有默认值,所以其价值不符合它返回NULL的条件。 'case'子句和'NOT IN'之间有区别,第一个返回所有行,但没有值,不符合条件,第二个查询将只返回符合条件的行。