以下は、長さを「5」に設定した変数Xに「abc」という文字を格納しています。
data DT1;
length X $5.; X = "abc"; run;
|
次に以下を実行してみます。
data DT2;
set DT1; Y = index( X, " " ); run;
|
(シングルバイト専用。日本語等マルチバイト文字には使用NG)
今回は、変数Xに半角スペース(空白)が何バイト目に含まれているかを求めています。
結果は「4」となり、4バイト目に半角スペースが含まれているということになります。
「abc」だから半角スペースなんてないはずですよね。
実は内部では以下のように長さ5のうち、余った末尾の2バイトには半角スペースが入っています。
「abc」だから半角スペースなんてないはずですよね。
X | ||||
---|---|---|---|---|
a
|
b
|
c
|
なので、
Y = index( X, " " );
|
は半角スペースが4バイト目にあると解釈したわけですね。
また以下のように文字値を結合する場合も
length Y2 $20.;
Y2 = X || "def";
|
変数Xの末尾に半角スペースが2つあるので「abc def」という結果になってしまいます。
そこでよく、trimn関数などで末尾の半角スペースを取り除く処理を入れたりします。
Y = index( trimn(X), " " ); |
length Y2 $20.; Y2 = trimn(X) || "def"; |
ただし、比較演算では末尾の半角スペースを考慮する必要はありません。
例えば「 "abc" = "abc " 」という比較演算の結果は「等しい」と判断されます。
「比較演算では末尾の半角スペースの有無に意味を持たせていない」ということですね。
今回のデータでも、where条件を書くとき、
where X = "abc ";
|
というように、わざわざ末尾を気にしなくても、以下で問題ないです。
where X = "abc";
|
0 件のコメント:
コメントを投稿