2016-11-11 1 views
2

PROC SQLでは、 "NAME"という列に何が来るかにかかわらず複数の値 "abc"、 "cde"、 "fbv"これらの値の前または後。だから私はこれを好きにした:SAS PROC SQLには1つのステートメントに複数の値が含まれていません

これはうまくいきますが、何百もの条件があれば頭痛になると思います。だから私の質問です - 我々はPROC SQLの1つのステートメントでこれを達成することができますか? 私はこれを使用してみました:

SELECT * FROM A WHERE 
    NOT CONTAINS(NAME, '"abc" AND "cde" AND "fbv"'); 

が、これは、PROC SQLでは動作しません、私は次のエラーを取得しています:

ERROR: Function CONTAINS could not be located.

私はLIKEを使用する必要はありません。

答えて

2

あなたは正規表現を使用することができ、私は考えます。

data a; 
input name $; 
datalines; 
xyabcde 
xyzxyz 
xycdeyz 
xyzxyzxyz 
fbvxyz 
;;;; 
run; 

proc sql; 

SELECT * FROM A WHERE 
    NAME NOT CONTAINS "abc" 
    AND 
    NAME NOT CONTAINS "cde" 
    AND 
    NAME NOT CONTAINS "fbv"; 


SELECT * FROM A WHERE 
    NOT (PRXMATCH('~ABC|CDE|FBV~i',NAME)); 
quit; 

このようにCONTAINSは使用できません。

+0

うまく働いた、ありがとう! 〜は私が仮定しているワイルドカードを意味しますか? – puk789

+1

'〜'は単なるデリミタです。正規表現で使われていない区切り文字で正規表現を開始して終了する必要があります。正規表現は、開始または終了するようにアンカーしない限り、どこでも一致します。 – Joe

+0

意味があります、もう一度ありがとうございます:) – puk789

0

あなたはNOT INを使用することができます。

SELECT * FROM A WHERE 
    NAME NOT IN ('abc','cde','fbv'); 
+0

しかし、私は必要それを含むレコードを除外する'abc'の前後にいくつの文字があるかにかかわらず、 'abc'。 – puk789

0

アイテムの数は、コード内で構築するために合理的な数を超えている場合、あなたは言葉を保存し、発生を確認することを反復する(work.words以下)の表を作成することができます。

data work.values; 
input name $; 
datalines; 
xyabcde 
xyzxyz 
xycdeyz 
xyzxyzxyz 
fbvxyz 
; 
run; 

data work.words; 
length word $50; 
input word $; 
datalines; 
abc 
cde 
fbv 
; 
run; 


data output; 
set values; 

/* build a has of words */ 
length word $50; 
if _n_ = 1 then do; 
    /* this runs once only */ 
    call missing(word); 
    declare hash words (dataset: 'work.words'); 
    words.defineKey('word'); 
    words.defineData('word'); 
    words.defineDone(); 
end; 

/* iterate hash of words */ 
declare hiter iter('words'); 
rc = iter.first(); 
found = 0; 
do while (rc=0); 
    if index(name, trim(word)) gt 0 then do; /* check if word present using INDEX function */ 
     found= 1; 
     rc = 1; 
    end; 
    else rc = iter.next(); 
end; 
if found = 0 then output; /* output only if no word found in name */ 
drop word rc found; 
run; 
関連する問題