ゴールのイメージをそろえる
今回のテーマは「Power Query で NULL(空値)を空白文字に統一する 実務テンプレ」です。
NULL が混ざっていると、次のようなトラブルが起きやすくなります。
- 結合キーとして使うときに、NULL だけ結合されない
- IF 条件で比較するときに、NULL が予期せず除外される
- 集計時に「空白」と「NULL」が別扱いになり、件数がズレる
こうした問題を防ぐために、「NULL はすべて空白(””)に統一する」という前処理が非常に有効です。
NULL と空白の違いを正しく理解する
NULL は「値が存在しない」、空白は「値はあるが中身が空」
Power Query における NULL は、
「そのセルには値が存在しない」という“欠損値”の扱いです。
一方、空白("")は
「値はあるが、中身が空の文字列」という扱いです。
この違いが、JOIN・比較・集計で大きな差を生みます。
例えば、次の比較はすべて false になります。
null = ""
null = " "
null = null
つまり、NULL は「何とも一致しない」特殊な存在です。
だからこそ、前処理で「NULL → 空白」に統一しておくと、後工程が安定します。
例題の前提データをイメージする
次のようなテーブルを想像してください。
| 顧客コード | 顧客名 | 電話番号 |
|---|---|---|
| A001 | 田中太郎 | null |
| A002 | null | 03-1234 |
| null | 山田花子 | null |
このまま JOIN や集計をすると、NULL が原因で意図しない結果になります。
ここで「NULL を空白に統一」すると、次のように整います。
| 顧客コード | 顧客名 | 電話番号 |
|---|---|---|
| A001 | 田中太郎 | “” |
| A002 | “” | 03-1234 |
| “” | 山田花子 | “” |
これで、後続処理が安定します。
基本テンプレ:全列の NULL を空白に統一する
完成コードを先に示す
Power Query で「全列の NULL を空白に統一」する最も実務的なテンプレはこれです。
let
Source = ・・・前のステップ・・・,
// 1) 全列に対して「null → 空白」を適用する変換リストを作成
TransformList =
List.Transform(
Table.ColumnNames(Source),
(colName) =>
{colName, each if _ = null then "" else _, type text}
),
// 2) Table.TransformColumns で一括変換
Replaced =
Table.TransformColumns(
Source,
TransformList
)
in
Replaced
Power Queryここから、初心者がつまずきやすいポイントを丁寧に解説します。
ステップごとの分解と深掘り
ステップ1:全列に対して「null → 空白」を適用する指示を作る
TransformList =
List.Transform(
Table.ColumnNames(Source),
(colName) =>
{colName, each if _ = null then "" else _, type text}
),
Power Queryここでやっていることは次の通りです。
Table.ColumnNames(Source)で「全列名のリスト」を取得List.Transformで「各列に対して同じ処理を適用する指示」を作る- 指示の内容は
{列名, 変換関数, 型}の3つセット
変換関数 each if _ = null then "" else _ は、
「その列の値が null なら空白に、それ以外ならそのまま」という意味です。
ここでの重要ポイントは、
列名を手書きしないため、列が増えても自動で対応できる
ということです。
ステップ2:Table.TransformColumns で一括変換
Replaced =
Table.TransformColumns(
Source,
TransformList
)
Power QueryTable.TransformColumns は「指定した列に変換関数を適用する」関数です。
TransformList を渡すことで、全列に対して「null → 空白」が一括で適用されます。
この時点で、すべての NULL が空白に統一されたテーブルが完成します。
例題2:特定の列だけ NULL → 空白にしたい場合
「全列ではなく、顧客名と電話番号だけでいい」という場合は、もっとシンプルに書けます。
let
Source = ・・・前のステップ・・・,
Replaced =
Table.TransformColumns(
Source,
{
{"顧客名", each if _ = null then "" else _, type text},
{"電話番号", each if _ = null then "" else _, type text}
}
)
in
Replaced
Power Query列が固定されている場合は、この書き方の方が読みやすいです。
例題3:NULL を空白ではなく「0」や「未入力」にしたい場合
NULL を空白ではなく、別の値に統一したいケースもあります。
例えば:
- 数値列は NULL → 0
- 文字列列は NULL → “未入力”
こうした場合も、変換関数を変えるだけです。
each if _ = null then "未入力" else _
Power Queryあるいは、
each if _ = null then 0 else _
Power QueryPower Query の変換は「列ごとに関数を指定する」だけなので、
NULL の扱いを柔軟に変えられます。
重要ポイントの深掘り
NULL を空白に統一するタイミング
NULL → 空白は、次のタイミングで行うのが最も安全です。
型変換(text 型への統一)をした直後
JOIN・集計・比較を行う前
理由はこうです。
- text 型にしておかないと、空白(””)が扱えない列がある
- JOIN の前に統一しておかないと、結合漏れが発生する
- 集計前に統一しておかないと、「NULL と空白が別扱い」になる
NULL を空白にするのは「前処理の早い段階」に入れておくのが鉄則です。
NULL と空白を混ぜたままにすると何が起きるか
JOIN の例で見てみます。
左テーブル:顧客コード = null
右テーブル:顧客コード = “”
この場合、JOIN は一致しません。
つまり、「本当は同じ“空欄”なのに結合されない」という事故が起きます。
NULL を空白に統一しておけば、
両方とも "" になり、JOIN が正常に動きます。
実務テンプレとしてのまとめ
「NULL を空白に統一」の本質は、たった一言です。
“NULL は比較も結合もできない特殊値なので、前処理で空白に統一しておく”
これをテンプレとして持っておくと、
JOIN の結合漏れ、IF 条件の不一致、集計のズレなど、
実務でよくある“NULL 由来のトラブル”をほぼ防げます。
