確か、書籍「統計解析ソフト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?
いや、よく見るとさらに、GET、LTE、NET、
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 件のコメント:
コメントを投稿