Proc-Sql案例混淆
SAS内部 我有一个procsql步骤,用于创建宏变量以执行一些列表处理 我遇到了一个令人困惑的步骤,使用case语句而不是where语句会导致结果数据集的第一行为空字符串(“”) 两个表中的任一字段中均不包含空字符串 以下是两个示例SQL步骤,为了简单起见,删除了所有宏业务:Proc-Sql案例混淆,sql,sas,Sql,Sas,SAS内部 我有一个procsql步骤,用于创建宏变量以执行一些列表处理 我遇到了一个令人困惑的步骤,使用case语句而不是where语句会导致结果数据集的第一行为空字符串(“”) 两个表中的任一字段中均不包含空字符串 以下是两个示例SQL步骤,为了简单起见,删除了所有宏业务: create table test as select distinct case when brand in (select
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)
;
使用第一段代码,结果是一个包含多行的表,第一行是空字符串
第二段代码按预期工作
有什么原因吗?是的,第一个在case语句中有no
子句,然后是
子句。我很惊讶它居然能解析。在许多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
;
获取空值的原因是,对于不匹配的品牌,case
语句是returnNULL
。您需要添加:
where brand1 is not NULL
为防止出现这种情况(使用子查询或使
brand1
成为计算字段)。是,第一个语句在case语句中有no然后是子句。我很惊讶它居然能解析。在许多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
;
获取空值的原因是,对于不匹配的品牌,case
语句是returnNULL
。您需要添加:
where brand1 is not NULL
为了防止出现这种情况(使用子查询或使brand1
成为计算字段)。您的第一个查询不正确,在“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”之间存在差异,第一个子句返回所有行,但不包含不满足条件的值,而第二个查询将只返回满足条件的行。您的第一个查询不正确,“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”之间存在差异,第一个查询返回所有行,但不包含不满足条件的值,而第二个查询只返回满足条件的行。因此,如果没有WHERE子句,则不会限制所选内容,即考虑每一行。CASE语句可以按条件存储项,但不会因为存储桶没有捕获所有内容而丢失结果,因此为NULL。WHERE限制返回的项目。因此,不同之处在于,如果没有WHERE子句,您就不会限制选择的内容,即每一行都会被考虑在内。CASE语句可以按条件存储项,但不会因为存储桶没有捕获所有内容而丢失结果,因此为NULL。其中限制了返回的项目。对不起,这是一个复制错误,我的实际代码中有一个then子句,更新了问题对不起,这是一个复制错误,我的实际代码中有一个then子句,更新了问题,因此空值基本上是不属于“大小写为true”且返回空字符串的行的结果,因为我没有ELSE?确切地说,它们仍然处于选中状态,因为它们未被WHERE条件排除。因为它们不符合CASE条件,所以它们是NULL,您可以通过ELSE或其他WHEN/THEN在CASE语句中给它们一个不同的值,或者将它们限制在WHERE条件中。因此NULL基本上是由于不属于CASE的行为true并返回NULL字符串,因为我没有ELSE?确切地说,由于WHERE标准未排除它们,因此仍在选择它们。由于它们不符合CASE条件,因此它们为NULL,您可以通过ELSE或其他WHEN/THEN在CASE语句中给它们一个不同的值,或者将它们限制在WHERE条件中。