0

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

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

第二段代码按预期工作

这有什么原因吗?

4

3 回答 3

4

所以不同之处在于,如果没有 WHERE 子句,您不会限制您选择的内容,IE 会考虑每一行。CASE 语句可以按标准对项目进行存储,但您不会因为您的存储桶没有捕获所有内容而丢失结果,因此为 NULL。WHERE 限制返回的项目。

于 2013-06-03T15:43:41.623 回答
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计算字段)。

于 2013-06-03T15:36:48.467 回答
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' 有区别,第一个返回所有行,但没有不满足条件的值,而第二个查询将只返回满足条件的行。

于 2013-06-03T15:39:44.653 回答