ラベル like の投稿を表示しています。 すべての投稿を表示
ラベル like の投稿を表示しています。 すべての投稿を表示

SQL専用演算子 eqt演算子について(その他のtruncated演算子についても)

SASのテクニック、というか実務者にとっての小技として、わざとエラーを出して、ログのエラーメッセージからSASに指定できるパラメータを教えて貰うというものがあります。

確か、書籍「統計解析ソフトSAS(工学社)」のどこかにも、そのことが書いてあって、わ~現場の泥臭い感じがいいな~って思いました。

さて、脱線しましたが、SQLプロシジャで色んな書き方を試して、遊んで?いた時のこと








「ERROR 22-322: 構文エラーです。次の 1 つを指定してください : !, !!, &, *, **, +, ',', -, /, <, <=, <>, =, >, >=, ?, AND, BETWEEN, CONTAINS, EQ, EQT, GE, GET, GT, GTT, LE, LET, LIKE, LT, LTT, NE, NET, OR, ^=, |, ||, ~=.」

今まで何回も出したことあるエラーですが、ふと目がとまりました。

え?EQTってなによ? あれ、GTT? は?LTT?
いや、よく見るとさらに、GETLTENET

EQはequal(=)のこと、GEはgreater than or equal to(大なりイコール ≧)ってわかるけど、
こいつらはなんなんだ!!

え~、結構SASオタのつもりだったのに、まさか、いまさら知らない演算子とか!!ショックだわ!
てか、SQL専用演算子なんかあったのか、勉強不足でした。

で、早速調べてみると、eqtは「equal to truncated strings 」とのこと、
http://support.sas.com/documentation/cdl/en/proc/61895/HTML/default/viewer.htm#a002473695.htm

で、その他のGTTとかLTTとかもどうやら同じような系統のようです。


で、一体、こいつはどんな働きをする子かな、と試してみました。

一つ理解すれば、後はまあ同じ拡張なので、今回はeqt演算子で。

data Q1;
X='ABCDE';output;
X='BCDEA';output;
X='DCDEB';output;
run;







というデータセットがあったとして


proc sql noprint;
create table A1 as
 select X
 from Q1
 where X eqt 'AB'
;
 quit;

とすると





あ~、なるほど、指定した抽出文字列の長さ以降を切り捨てて比較ということか、
だからtruncatedね、
つまりこの場合、平たく言うと Xが'AB'から始まる文字列ってことか。

そうするとike演算子で

proc sql noprint;
create table A0 as
 select X
 from Q1
 where X like 'AB%'
;
 quit;

と書くのと同じか。
like演算子については記事「whereステートメントでのみ使用できる演算子_contains,between,like」

を参照してください(ただし、記事に誤解を招く表現があります。
この記事はデータステップのwhereステートメントでの話であって、like演算子はsqlでは、別にwhere句に限定せずに記述できますからね)


なるほど~、じゃあ例えばXが「AB」から始まる場合にフラグ変数をたてたければ

proc sql noprint;
create table A2 as
 select X
       ,X eqt 'AB' as FL
 from Q1
;
 quit;










あるいは

data Q2;
Y='BC';output;
Y='DC';output;
Y='AB';output;
run;







みたいなデータセットと以下のような条件で結合する

proc sql noprint;
create table A3 as
 select X,Y
 from Q1 inner join Q2 on
 x eqt Y 
;
 quit;












って感じになる。


あ~、これ結構いいですね!守備範囲せまいけど、like演算子で記述するより見た目がすっきりしてますね!
今後、gtt lttとかの使い道についても考えてみます。

でも、これって、知らない人がコードレビューしたら、絶対ミスタイピングだと思われそう、、、。

whereステートメントでのみ使用できる演算子_contains,between,like

データの抽出について、サブセット化IFステートメントでは使用できず、whereステートメントでのみ利用できる演算子がいくつかあります。それらの紹介です。

今、以下のようなデータセットがあったとします。

data Q1;
 X='ABCDE';output;
 X='FGHIJ';output;
 X='KLNMO';output;
 X='PQRST';output;
 X='UVWXY';output;
run;









①contains演算子

data A1;
 set Q1;
 where X contains 'K';
run;





これは○○を含むデータを抽出します。
上記の場合、Kという文字が、どこかに含まれて入れば抽出されます。
つまり

data A1_;
 set Q1;
 if index(X,'K')>0;
run;

と同じ意味になります。


②between演算子

data A2;
 set Q1;
 where X between 'K' and 'Z' ;
run;






通常、数値に対して使用することが多いですが、文字変数に対しても適用できます。
between ○ and ×; で○と×を含んでその間に存在する値を抽出します。
今回は辞書を想像していただいて、KとZの間にある文字列が抽出されます。


③like演算子

data A3;
 set Q1;
 where X like '%I%' ;
run;





data A4;
 set Q1;
 where X like '_B_D%' ;
run;





likeの後に文字パターンを指定し、それに合致するものを抽出します。

%は0から無制限の長さの文字列です。like '%I%' contains 'I'と同義です。
 '_' ;は任意の1文字を表します。
一文字何かの後、Bがきてその後またなんでもいいので一文字きて、Dがきて、その後は何もなくてもいいし、どんな文字がどれだけきてもいいですから、そのパターンに一致するのを抽出してというのがwhere X like '_B_D%' ;ですね。