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とかの使い道についても考えてみます。

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

0 件のコメント:

コメントを投稿