Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Proc-Sql案例混淆_Sql_Sas - Fatal编程技术网

Proc-Sql案例混淆

Proc-Sql案例混淆,sql,sas,Sql,Sas,SAS内部 我有一个procsql步骤,用于创建宏变量以执行一些列表处理 我遇到了一个令人困惑的步骤,使用case语句而不是where语句会导致结果数据集的第一行为空字符串(“”) 两个表中的任一字段中均不包含空字符串 以下是两个示例SQL步骤,为了简单起见,删除了所有宏业务: create table test as select distinct case when brand in (select

SAS内部

我有一个procsql步骤,用于创建宏变量以执行一些列表处理

我遇到了一个令人困惑的步骤,使用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)
    ; 
使用第一段代码,结果是一个包含多行的表,第一行是空字符串

第二段代码按预期工作


有什么原因吗?

是的,第一个在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
语句是return
NULL
。您需要添加:

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
语句是return
NULL
。您需要添加:

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条件中。