last update: 2004年10月25日

NULL値について

NULL値の表現

NULL値の発生するケース

  1. CSVなどの変換元データの値がなかった場合
  2. 0割り算を含む演算が行われたとき
  3. 項目の結合時に対応するキーがなかった場合
  4. その他、処理上ありえないデータを参照したとき
  5. NULL値に対する演算を行った場合

キー項目に関するNULL値の扱い

文字列に対する数値演算

NULL値を扱うコマンド

  1. NULL値の変換(xtnulto)
  2. NULL値を含む行の削除・選択(xtdelnul)
  3. NULL値の判別
  4. 選択条件

NULL値の表現

MUSASHIではNULL値を"*"で表現している。より正確に言えば、"*"で始まる文字列は全てNULL値として認識される。よって、以下の表における「名前」項目では、顧客A〜Cは全てNULL値として認識され、D〜EはNULL値としては認識されない。

顧客 名前
A
B
C
D
E
F
*
*aaa
****
aaa*
aa*aa
a***

NULL値の発生するケース

データ処理においてNULL値は、以下のようなときに生じる。

1) CSVなどの変換元データの値がなかった場合

顧客,数量,金額
A,10,100
B,,200
C,5,
D,,
,,,
csv2xt -F
顧客 数量 金額
A
B
C
D
*
10
*
5
*
*
100
200
*
*
*

CSVデータの2〜5行目には、値のない項目が含まれている。それら全てNULL値に変換される。

2) 0割り算を含む演算が行われたとき

顧客 数量 金額
A
B
C
D
10
0
100
0
100
10
0
0
xtcal -c '$金額/$数量' -a 単価
顧客 数量 金額 単価
A
B
C
D
10
0
100
0
100
10
0
0
10
*
0
*

顧客BとDは数量が0のため、金額÷数量の演算において0割り算となり、結果NULL値が出力される。

3) 項目の結合時に対応するキーがなかった場合

顧客 数量 金額
A
B
C
D
10
0
100
0
100
10
0
0
顧客 名前
A
C
宮本武蔵
佐々木小次郎
cust.xt
xtjoin -k 顧客 -m cust.xt -f 名前 -n
顧客 数量 金額 名前
A
B
C
D
10
0
100
0
100
10
0
0
宮本武蔵
*
佐々木小次郎
*

顧客名の結合時に、顧客「B」と「D」はcust.xtファイルに存在しないため、NULL値を出力。なお、xtjoinにおいては「-n」を指定しなければ、NULL値を含む行は出力されない。

4) その他、処理上ありえないデータを参照したとき

顧客 日付
A
A
A
B
20040101
20040102
20040103
20040101
xtslide -k 顧客 -f 日付:次日付 -n
顧客 日付 次日付
A
A
A
B
20040101
20040102
20040103
20040101
20040102
20040103
*
*

顧客別に日付項目を一行上にずらし、「次日付」という項目を追加している。その時、顧客Aの20040103の次の日付、そして顧客Bの20040101の次の日付はないために、NULL値が出力される。なお、xtslideにおいては「-n」を指定しなければ、NULL値を含む行は出力されない。

5) NULL値に対する演算を行った場合

数量 金額
10
0
100
0
100
10
*
0
xtagg -f 金額,数量 -c sum
数量 金額
110 *

金額項目の3行名がNULL値のために、集計結果もNULL値となる。

キー項目に関するNULL値の扱い

キー項目にNULL値が含まれている場合は、"*"という値として処理が行われる。

顧客 金額
A
A
*
*
100
10
20
11
xtagg -k 顧客 -f 金額 -c sum
顧客 金額
A
*
110
31

文字列に対する数値演算

MUSASHIが扱うXMLtableのデータ構造においては数値型や文字列型などのデータ型は存在しない。よって値として「文字列」を伴う項目に対しても数値演算を行うことができてしまう。そのような場合、本来ならばNULL値を出力すべきであろうが、効率性の理由からNULL値は出力しない。技術的に言えばC言語におけるatof関数によって決まる。

顧客 金額
A
B
C
D
1
1aa
aa1
1aa1
xtagg -k 顧客 -f 金額 -c sum
顧客 金額
A
B
C
D
1
1
0
1

NULL値を扱うコマンド

NULL値に関する処理を行うコマンドについて解説する。

1) NULL値の変換(xtnulto)

xtnultoコマンドを利用することによってNULL値をある文字列に変換することができる。

顧客 数量 金額
A
B
C
D
10
*
100
*
100
10
*
*
xtnulto -f 金額,数量 -v NULL
顧客 数量 金額
A
B
C
D
10
NULL
100
NULL
100
10
NULL
NULL

-fで指定した「金額」と「数量」項目に関して、NULL値を"NULL"という文字列に変換している。

2) NULL値を含む行の削除・選択(xtdelnul)

xtdelnulコマンドを利用することによってNULL値を含む行を削除したり選択したりすることができる。

顧客 数量 金額
A
B
C
D
10
*
100
*
100
10
*
*
xtdelnul -f 金額,数量 -v NULL
顧客 数量 金額
A 10 100

「金額」項目がNULL、もしくは「数量」項目がNULLであれば、その行を削除する。AND条件にしたければ-Fオプションを付ければよい。

3) NULL値の判別

xtcalもしくはxtselコマンドでは、isNull関数を利用することによって、データがNULLであるかどうかを判別できる。

顧客 数量 金額
A
B
C
D
10
*
100
*
100
10
200
200
xtcal -c 'if(isNull($数量), $金額, $金額/数量' -a 単価
顧客 数量 金額 単価
A
B
C
D
10
*
100
*
100
10
200
200
10
10
2
200

「数量」がNULLであれば「金額」を出力し、そうでなければ「金額÷数量」を出力する。

4) 選択条件

xtsel,xtselstrなどの行選択のコマンドでは、NULL値は指定の条件に「マッチしない」ものとして扱われる。このことによりアンマッチの行を出力する「-uファイル名」パラメータが指定された場合は、指定されたファイルにNULL値の行が出力される。

顧客 性別
A
B
C
D

*

*
xtselstr -f 性別 -v 男 -o match.xt -u unmatch.xt match.xt
顧客 性別
A
unmatch.xt
顧客 性別
B
C
D
*

*