The Nameless City

何故か製薬やSAS関連のブログ、の予定。

SASの欠損値

www.cresco.co.jp
見かけて、ふむふむと頷いていたのですが。

SASの欠損値の要諦

missing valueと英語表記されますが、RDBのNULLとは違う挙動をします。

  • NULLは型としてNULL型があるが、SASの場合には文字列型・数値型などの型を持ちます。
    • 結果として、欠損値は「値」です。
      • 「値」なので比較出来ます。その際には、マイナス無限大のように振る舞います。
      • なおSASでは文字列も一般的なプログラム言語と同様に比較演算可能です。
    • 数値型には特殊欠損値というものがあります。
      • ODSデータセットとかでぶっこ抜く場合にたまに遭遇しますが、印字の所でしか出会った事はないです。
      • その時々の定義でこう使う、というのを決めて使うもので、あんま気にしないでいいです。
    • 文字型の欠損値は半角空白です。
      • なおSASでの取扱では、定義長未満の文字列を格納する際に、後ろ側に半角スペース(0x20)が埋められます。

数値欠損値を文字に暗黙のキャストを行うと、「.」が文字として出てきます。
これが結構タチが悪いので、共通のマクロなんかではちゃんと出てこないように制御した方がいいです。

SASの論理演算の要諦

SASの論理演算は、数値の結果を返します。
FALSE→ 0
TRUE → 1
また、RDBの論理演算と異なり、NULLは扱わないです。
なお、数値を論理にキャストする場合には、
0または欠損値→FALSE
上記以外→TRUE
です。

WHEREステートメントSQLの中では使えるが外では使えぬ「is not null」

missing関数使うといいです。

余談

他言語のNULLと違う!という話とかはよく聞くしまあそういう説明もするのですが、実の所、他言語でも別に統一されている訳ではないのでなんとも言い難いのがNULLです。