ゴールのイメージをそろえる
今回のテーマは「Power Query で“空白(”” や スペースだけの文字列)を NULL に統一する”実務テンプレ」を身につけることです。
さっきの「NULL を空白に統一」とは逆方向のパターンですね。
どちらを採用するかは“後工程でどう扱いたいか”次第ですが、
集計や「欠損値として扱いたい分析寄りの処理」では、空白より NULL に統一した方が都合がいいことが多いです。
ここでは、次の2つをしっかり押さえます。
「空白」と「NULL」の違いを感覚ではなく言葉で理解する。
文字列列の「空白っぽい値」をきれいに NULL にそろえるテンプレを持つ。
空白と NULL の違いをちゃんと整理する
空白は「中身が空の文字列」、NULL は「値そのものが存在しない」
Power Query における空白("")は、「文字列としての値はあるが、中身が空」という状態です。
一方、NULL は「そのセルに値が存在しない」という“欠損値”です。
例えば、次の比較はすべて false になります。
"" = null" " = nullnull = null
つまり、NULL は「何とも一致しない特別な存在」です。
だからこそ、「欠損値としてちゃんと扱いたい」「空欄を“無いもの”として集計したい」場合は、
空白を NULL に統一しておくと、後のロジックがシンプルになります。
例題の前提データをイメージする
次のようなテーブルを想像してください。
| 顧客コード | 顧客名 | 電話番号 |
|---|---|---|
| A001 | 田中太郎 | “” |
| A002 | “” | “03-1234” |
| “” | 山田花子 | ” “ |
ここには、いろいろな「空白っぽい値」が混ざっています。
顧客名が ""(完全な空文字)
顧客コードが ""(空文字)
電話番号が " "(スペースだけ)
見た目は「空欄」に見えますが、Power Query 的には全部「値あり」です。
これを「欠損値として扱いたい」なら、全部 NULL にそろしてしまった方が扱いやすくなります。
基本テンプレ:文字列列の「空白」を NULL に統一する
まずは「空文字だけ」を NULL にするシンプル版
一番シンプルなパターンは、「"" を NULL に変える」テンプレです。
let
Source = ・・・前のステップ・・・,
Replaced =
Table.ReplaceValue(
Source,
"",
null,
Replacer.ReplaceValue,
{"顧客コード", "顧客名", "電話番号"}
)
in
Replaced
Power Queryこれは、「指定した列の中の "" をすべて null に置き換える」という処理です。
列が少ない、固定されている、という場合はこれで十分です。
ただし、ここで置き換えられるのは「完全な空文字」だけです。" "(スペースだけ)や " "(全角スペースだけ)は対象外です。
実務向け:空文字+スペースだけの文字列も NULL にする
「見た目が空欄なら全部 NULL にしたい」という現場仕様
実務では、「スペースだけ入っているセル」も“空欄扱い”にしたいことが多いです。
その場合は、単純な ReplaceValue では足りないので、「Text.Trim で前後の空白を削ってから判定する」関数を使います。
1列に対して「空白っぽい値 → NULL」をかけるテンプレ
まずは、顧客名列だけに適用するイメージで書いてみます。
let
Source = ・・・前のステップ・・・,
Replaced =
Table.TransformColumns(
Source,
{
{
"顧客名",
each
let
t = Text.Trim(Text.From(_))
in
if t = "" then null else _,
type nullable text
}
}
)
in
Replaced
Power Queryここでやっていることを分解します。
Text.From(_) で、値をいったん文字列として扱う(NULL の場合はエラーになるので、本当はもう少し丁寧に書くのが安全ですが、まずはイメージ優先)。Text.Trim(...) で、前後の空白(半角・全角)を削る。
トリム後の文字列が "" なら null に、それ以外なら元の値をそのまま返す。
これで、"" も " " も " " も、全部 NULL に統一できます。
全ての文字列列に一括で「空白 → NULL」をかけるテンプレ
「どの列に空白が紛れているか分からない」ケース
列が多い、どこに空白が入っているか分からない、という場合は、
「文字列型の列を自動で拾って、全部に“空白 → NULL”をかける」テンプレが便利です。
let
Source = ・・・前のステップ・・・,
// 1) 文字列型の列名だけを取得
TextColumns =
List.Select(
Table.ColumnNames(Source),
(colName) =>
Value.Type(Source[colName]) = type text
),
// 2) 各文字列列に「空白 → NULL」を適用する変換リストを作成
TransformList =
List.Transform(
TextColumns,
(colName) =>
{
colName,
each
let
v = _
in
if v = null then
null
else
let
t = Text.Trim(Text.From(v))
in
if t = "" then null else v,
type nullable text
}
),
// 3) 一括変換
Cleaned =
Table.TransformColumns(
Source,
TransformList
)
in
Cleaned
Power Queryここでの重要ポイントは二つです。
最初に v = null をチェックして、もともと NULL のものはそのまま残していること。
Text.Trim で「空白だけの文字列」を空文字にしてから、"" なら NULL にしていること。
これをクレンジングの早い段階に一発入れておけば、
「見た目が空欄のものは全部 NULL」という、分析寄りのきれいな状態を作れます。
どのタイミングで「空白 → NULL」をやるべきか
型変換とセットで考えるのがコツ
空白 → NULL は、次のタイミングで行うのが一番扱いやすいです。
テキストとして扱いたい列を text 型にそろえた直後。
そのあとで、必要な列を number や date に変換する前。
理由はこうです。
数値列にしたい列に " " や "" が入っていると、そのまま number 型に変換するとエラーになる。
先に「空白 → NULL」にしておけば、number 型への変換時に「NULL は欠損値としてスルー」される。
つまり、「空白を NULL にしてから型変換」の順番にしておくと、
変換エラーをかなり減らせます。
「NULL に統一」と「空白に統一」をどう使い分けるか
どっちが正解、ではなく「目的に応じて使い分け」
前の回では「NULL を空白に統一」、今回は「空白を NULL に統一」と、真逆のことをやっています。
どちらが正しい、ではなく「何をしたいか」で使い分けます。
NULL → 空白に統一した方が楽な場面は、
「文字列として扱い続けたい」「見た目も空欄にしたい」「JOIN キーとして空欄も含めて扱いたい」とき。
空白 → NULL に統一した方が楽な場面は、
「欠損値として扱いたい」「集計で“未入力”をちゃんとカウントしたい」「数値・日付への変換エラーを減らしたい」とき。
あなたのクエリの“ゴール”がどちら寄りかで、
どちらのテンプレを採用するか決めるといいです。
実務テンプレとしてのまとめ
「空白を NULL に統一」の本質は、たった一言です。
見た目が空欄のもの("" やスペースだけ)を、全部「値が存在しない(NULL)」として扱えるようにそろえる。
これをクレンジングのテンプレとして持っておくと、
欠損値の扱い、型変換、集計、分析が一気に安定します。
