2013-06-03 59 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'之間有區別,第一個返回所有行,但沒有值,不符合條件,第二個查詢將只返回符合條件的行。