2014-12-30 70 views
1

我有一個數據庫,我通過SAS EG 5.1SAS變量沒有類型

最初的代碼在程序中PROC SQL一步導入我以前做的,這是如下:

CREATE TABLE WORK.TABLE AS 
    SELECT * FROM connection to some_source (
    SELECT * 
    FROM some_table 
    WHERE LOGIN_ID IN (SELECT ID FROM WORK.ID_List);; 

這生成錯誤:「使用IN的表達式具有不同數據類型的組件。」

這些都應該是數字(我知道ID是數字),但我認爲LOGIN_ID必須表示爲字符,並決定將其轉換爲數字在這一步。我摸索谷歌了很長一段時間,試圖找到一種方法來做到這一點,直到一位同事告訴我,除非列出所有40列,並使用AS,這將是最後的手段,否則無法在此步驟中完成。我不確定他是否正確。

所以我刪除了WHERE子句來查看數據。這一切看起來不錯,LOGIN_ID肯定看起來數字,所以我嘗試使用VTYPE來檢查其類型。我得到的是一列空值(點)。再次,谷歌在這裏沒有幫助。

那麼,這些數字如何不能有一個類型?另外,有關如何解決原始問題的任何想法都非常感謝!

+0

你是如何使用'vtype'?在數據步驟? – Joe

+0

是的,數據步驟 – Rookatu

+1

你可以舉一個你如何使用'vtype()'的例子嗎?是否像'x = vtype(login_id);'那麼你看結果數據集中的'x'?你有沒有日誌消息? –

回答

2

你可以試試這個:

create table work.table as 
select a.* 
from connection to some_source (
    select * 
    from some_table 
) as a 
inner join work.id_list as b 
on cats(a.login_id) = cats(b.id); 

傳遞給連接的SQL查詢必須是在主機數據庫系統的有效,所以它避免從查詢中引用SAS表是一個好主意。要獲得您希望使用in運算符的結果,您可以在您的SAS數據集上使用inner join

cats()函數會盲目地將其參數轉換爲字符串,並刪除前導空格和尾隨空格。所以如果login_idid不是相同的類型,這將確保它們仍然可以適當匹配。請注意,缺少的數字值將變爲".",並且缺少的字符值將變爲"",因此最好了解是否在要加入的列中缺少值。

如果要顯式更改連接查詢中的類型,則只需列出所有列而不是使用select *。上述方法將避免必須這樣做。

+0

這位同事只關注改變'login_id'的類型,它需要移除'*'。另一種方式(你如何做,或類似)是正確的。 – Joe

+1

我還注意到你可以保留內部查詢,並使用它類似於上面:'在其中login_id(從work.id_list中選擇put(id,8。))''或類似的(或者使用'cats',雖然我個人的東西'put'更正確 - 'cat'會使用默認的'best12.'格式,這對於長ID偶爾會有危險)。 – Joe

+0

@Joe:謝謝,我似乎錯過了直接在'select'中改變'login_id'類型的觀點。對於這位同事爲什麼認爲這是一條路,我感到很困惑。 :P –