2016-11-07 30 views
2

Proc SQLとcase文を使用して条件をテストし、インデックスを追加しようとしています。しかし、構文が私が見た例と一致するように見えるにもかかわらず、case - where文を動作させることはできません。私は次のエラーを取得する下のコードを使用:ヘルプで見ることができるものから、Proc SQLとCase文を使用するとエラーが発生する

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

PROC-SQLは、私の知る限り、以下のCASE表現のためのANSI標準の構文は、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; 

注:I CONTAINSへの電話をFIND機能で置き換えました。this SAS referenceにはCONTAINSWHERE句でのみ使用できます。

ところで、テーブル1,2にジョイン条件を追加しようと思ったかもしれません。現在、それらの間でオープンエンドのクロス結合を行っています。しかし、うまくいけば私のクエリはCASE式のエラーを解決します。

+0

Gah!私はどのようにして盲目的になるのでしょうか?そして、例が 'いつ'(あなたが言うように) 'not'を使っているのを見ていません。テーブルを結合するときに私は 'where'を前のコードと同じように使用していました。そのため、コードをコピーした後に'どこで 'つまったのですか?ありがとう! – fileunderwater

+0

私が 'Contains'を使用した理由は、(t1.test)を検索するために一連の文字列(t2で見つかったもの)を渡し、レコードを選択したりインデックス付けしたりすることでした。 'Find'は動作しますが、t2の各一致について個別に検索し、結果の表はlength(t1)* length(t2)となり、重複を除去するために後処理が必要です。しかし、ソリューションをありがとう。 – fileunderwater

+1

私はあなたが答えを投稿した直後にupvotedし、今受け入れている – fileunderwater

関連する問題