2017-04-06 75 views
0

我有一個簡短的向量,我希望能夠在PROC SQL中的case語句中使用。我沒有從我的研究中找到任何東西。讓我用一個例子來解釋。是否可以在PROC SQL case語句中使用向量?

我的手機品牌的載體:

phone_brand 
nokia 
samsung 
apple 
microsoft 
sony 
motorolla 

我想要與更多的數據的另一個表中的PROC SQL語句,但我想創建一個指標,會告訴我,如果的phone_brand場該表與矩陣匹配。因此,代碼的想法是這樣的:

proc sql; 
create table test as 
select id 
     ,date 
     ,case when index(home.phone_brand,'vector values') > 0 then 1 else 0 
     end as vector_ind 
from ods.home; 
quit; 

我需要這個,因爲我有載體將是動態的,但沒有任何排序鍵來識別品牌。所以我必須使用索引函數來搜索匹配。如果我不能找到一種方法,與我覺得我唯一的選擇將是手動每次更新代碼的矢量的變化是這樣的數據矢量做到這一點:

,case when index(home.phone_brand,'nokia') > 0 then 1 
    when index(home.phone_brand,'samsung) > 0 then 1 
    when index(home.phone_brand,'apple) > 0 then 1 
    ....... 
    else 0 end as vector_ind 

這將是繁瑣,如果矢量中的品牌數量顯着增加,則難以擴展。

回答

2

我認爲你正在尋找IN操作符。

proc sql; 
select name , sex , age 
    , name in ('Alfred','Carol') as vector_ind 
from sashelp.class 
; 

您也可以存儲在列表宏變量

%let vector = 'Alfred','Carol' ; 

,然後在查詢中使用宏變量。

select name , sex , age 
    , name in (&vector) as vector_ind 
from sashelp.class 
; 

或將其存儲在數據集中,

create table vector as 
    select name 
    from sashelp.class 
    where name in (&vector) 
; 

和使用子查詢。

select name , sex , age 
    , name in (select name from vector) as vector_ind 
from sashelp.class 
; 

或者你也可以結合過去兩年。將值存儲在數據集中,但使用它來構建一個宏查詢以用於查詢。

select catq('1sa',name) 
    into :vector separated by ',' 
    from vector 
; 
+0

這完美的作品!這隻能找到完全匹配嗎?我通常使用'索引'來解決數據中的不一致(不一致的縮寫和拼寫錯誤)。你知道我在這段代碼中如何調整? – Jarom

+1

IN是完全匹配,但您可以在(%upcase(&vector))中使用'upcase(name)'來避免大小寫問題。 – Tom

相關問題