2016-11-07 128 views
2

我試圖使用Proc SQL和一個case-statement來測試一個條件並添加一個索引。但是,即使語法看起來與我見過的示例相匹配,我也無法使case - where語句正常工作。使用下面的代碼,我得到以下錯誤:使用Proc SQL和Case-statement時出錯

ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, a numeric constant, a datetime constant, a missing value, (, +, -, BTRIM, CALCULATED, CASE, EXISTS, INPUT, NOT, PUT, SELECT, SUBSTRING, TRANSLATE, USER, WHEN, ^, ~.

Proc SQL; 
    Create table table_ix AS 
    Select t1.*, 
      Case 
       Where UPCASE(t2.test) Contains UPCASE(TRIM(t2.key)) Then 1 
       Else 0 
      end as index 
    From Table1 AS t1, Table2 AS t2; 

QUIT; 

從什麼可以在幫助看,我的發言的例子相匹配。這可能很容易解決,但我不能讓它工作(例如,我試過匹配單個字符串以查看對單獨表格的引用是否是問題,例如... Contains UPCASE("Teststring") ....
任何建議

回答

3

ANSI標準語法的CASE表達,這PROC-SQL如下據我所知,是CASE WHEN,不CASE WHERE嘗試此查詢:?

CREATE TABLE table_id AS 
SELECT t1.*, 
     CASE WHEN FIND(t2.test, TRIM(t2.key), 'i') GE 1 THEN 1 ELSE 0 END AS index 
FROM Table1 AS t1, Table2 AS t2; 

注:我用FIND函數將您的呼叫替換爲CONTAINS,因爲this SAS reference提到CONTAINS僅在WHERE條款中可用。

順便說一下,您可能打算在表1和表2中添加連接條件。目前,你正在做一個開放式的交叉連接。但希望我的查詢將解決您的CASE表達式中的錯誤。

+0

嘎!我怎麼能這樣盲目,沒有看到這些例子使用'when'(如你所說)而不是'where'。在連接表時,我在代碼的早期使用'where'進行類似的匹配,這就是爲什麼我在複製代碼後被'where'卡住的原因。謝謝! – fileunderwater

+0

我使用'Contains'的原因是傳遞一系列字符串(在t2中找到)在(t1.test)中搜索,選擇或索引記錄(這也是我沒有加入的原因)。 'Find'可以工作,但是在t2中對每個匹配單獨搜索到結果表將變爲length(t1)* length(t2),並且需要一些後處理來刪除重複項。儘管感謝解決方案。 – fileunderwater

+1

我在發佈答案後立即投了票,現在已經接受了 – fileunderwater