null を扱うとは何か
Power Query(M言語)で「null を扱う」というのは、「値がない状態」をきちんと意識して処理することです。 実務のデータには、未入力・欠損・不明・取得失敗など、さまざまな「空っぽ」が紛れ込んでいますが、M言語ではそれを特別な値 null で表現します。
重要なのは、null は 0でも空文字でもfalseでもない、まったく別の「値なし」を表す存在だということです。 ここを正しく理解しておかないと、フィルタ・集計・判定ロジックで思わぬバグやセキュリティ上の問題を生みやすくなります。
M言語における null の基本
null は「値が存在しない」ことを表す特別な値です
M言語では、次のような値が存在します。
- 数値:
100 - 文字列:
"ABC" - 論理値:
true/false - 特別な値:
null
null は「0」でも「空文字」でも「false」でもなく、 「そもそも値が入っていない」という状態を表します。
最小の例は次のようになります。
let
EmptyValue = null
in
EmptyValue
Power Queryこの EmptyValue は「何も入っていない箱」です。
実務では、次のような場面で null が現れます。
- Excelの空セル
- CSVの空フィールド
- 取得できなかった値
- 計算結果が出せなかった場合(例:0で割ったときのエラー処理後など)
null をステップバイステップで理解する
ステップ1:null と他の「空っぽ」を区別する
よく混同されるのが、次の3つです。
null:値がない"":空文字(長さ0の文字列)0:数値のゼロ
例:
let
A = null,
B = "",
C = 0
in
[A = A, B = B, C = C]
Power Queryこれらはすべて別物です。
「顧客コードが未入力かどうか」を判定したい場合、 null と "" の両方を考慮する必要があります。
IsCustomerCodeMissing =
([顧客コード] = null or [顧客コード] = "")
Power Queryここを雑に扱うと、「本当は未入力なのに有効扱いしてしまう」といったバグにつながります。
ステップ2:null を条件式で扱う
null を判定するときは、必ず = null や <> null を使う必要があります。
IsNull = ([顧客コード] = null)
IsNotNull = ([顧客コード] <> null)
Power Query注意すべきなのは、null をそのまま論理値として扱えないという点です。
例えば次のようなコードは危険です。
if [顧客コード] then ... // これはNG
Power Query[顧客コード] が文字列や null の場合、 意図しない動作やエラーの原因になります。
必ず「nullかどうか」「空文字かどうか」を明示的に判定することが重要です。
ステップ3:null を別の値に置き換える
実務では、「null のままだと困るので、代わりの値を入れたい」という場面が多いです。
if で置き換える例
let
CustomerCode =
if [顧客コード] = null or [顧客コード] = "" then
"UNKNOWN"
else
[顧客コード]
in
CustomerCode
Power QueryTable.ReplaceValue を使う例
let
ReplacedNullCustomerCode =
Table.ReplaceValue(
SalesTable,
null,
"UNKNOWN",
Replacer.ReplaceValue,
{"顧客コード"}
)
in
ReplacedNullCustomerCode
Power Queryこのように、「nullをどう扱うか」を明示的に決めておくことが、品質・セキュリティの両面で非常に重要です。
null を列として扱う具体例
例:必須項目の欠損をフラグ化する
let
SalesTable = Excel.CurrentWorkbook(){[Name="売上"]}[Content],
AddedMissingFlag =
Table.AddColumn(
SalesTable,
"必須項目欠損",
each ([顧客コード] = null or [金額] = null),
type logical
),
MissingRows =
Table.SelectRows(AddedMissingFlag, each [必須項目欠損] = true),
ValidRows =
Table.SelectRows(AddedMissingFlag, each [必須項目欠損] = false)
in
[正常行 = ValidRows, 欠損行 = MissingRows]
Power Queryここでは、
顧客コードまたは金額がnullの行を「欠損行」としてフラグ化し- 欠損行と正常行を分離しています
このように、null をきちんと検出して分離することが、 データ品質管理の基本になります。
null を扱うときの重要な注意点
1. null は「比較や計算で伝染する」ことがある
M言語では、null を含む計算や比較の結果が null になることがあります。
例:
Result = null + 10 // 結果は null
IsGreater = null > 0 // 結果は null
Power Queryこのように、「値がない状態」が計算結果にも伝染してしまうため、 null を事前に処理しておくことが重要です。
2. 集計時の null の扱いに注意する
List.Sum や List.Average などの集計関数は、 null を含むと意図しない結果になることがあります。
安全な書き方の一例は次の通りです。
let
AmountList =
List.RemoveNulls(SalesTable[金額]),
TotalAmount =
List.Sum(AmountList)
in
TotalAmount
Power QueryList.RemoveNulls で null を取り除いてから集計することで、 「欠損値のせいで集計結果が壊れる」ことを防げます。
3. null とエラーを区別する
M言語には、null とは別に「エラー」という状態もあります。
null:値がない- エラー:計算や処理が失敗した
これらを区別せずに扱うと、 「本当はエラーなのに、単なる欠損として処理してしまう」といった問題につながります。
エラーを検出するには try ... otherwise を使います。
let
SafeDivision =
(x as number, y as number) as nullable number =>
let
Result =
try x / y
in
if Result[HasError] then
null
else
Result[Value]
in
SafeDivision
Power Queryここでは、エラーが発生した場合に null を返していますが、 「エラーなのか欠損なのか」を区別したい場合は、 別のフラグ列を用意するなどの工夫が必要です。
4. セキュリティ・品質の観点からの null
null を雑に扱うと、次のようなリスクがあります。
- 必須項目が未入力なのに「有効データ」として扱ってしまう
- 権限チェックが null のせいでスキップされてしまう
- 外部システムに不完全なデータを送信してしまう
そのため、セキュリティや品質が重要な場面では、
- 必須項目に null がないことを事前に検証する
- null があった場合の扱い(除外・エラー・補完)を明確に決める
- ログやレポートで「null の件数」を可視化する
といった対策が有効です。
実務で使える null 処理テンプレート
テンプレ1:必須項目の欠損チェック
let
SalesTable = Excel.CurrentWorkbook(){[Name="売上"]}[Content],
AddedMissingFlag =
Table.AddColumn(
SalesTable,
"必須項目欠損",
each ([顧客コード] = null or [金額] = null),
type logical
),
MissingRows =
Table.SelectRows(AddedMissingFlag, each [必須項目欠損] = true),
ValidRows =
Table.SelectRows(AddedMissingFlag, each [必須項目欠損] = false)
in
[正常行 = ValidRows, 欠損行 = MissingRows]
Power Queryテンプレ2:null を業務上のデフォルト値に置き換える
let
DefaultCustomerCode = "UNKNOWN",
ReplacedNullCustomerCode =
Table.ReplaceValue(
SalesTable,
null,
DefaultCustomerCode,
Replacer.ReplaceValue,
{"顧客コード"}
)
in
ReplacedNullCustomerCode
Power Queryテンプレ3:集計前に null を除去する
let
AmountList =
List.RemoveNulls(SalesTable[金額]),
TotalAmount =
List.Sum(AmountList),
AverageAmount =
if List.Count(AmountList) = 0 then
null
else
TotalAmount / List.Count(AmountList)
in
[合計金額 = TotalAmount, 平均金額 = AverageAmount]
Power Queryまとめ:null を扱うことは「値がない状態を意識して設計すること」
M言語で null を扱うというのは、 「値がない状態」をきちんと認識し、その影響をコントロールすることです。
これによって、
- データ品質を保てる
- 集計結果の信頼性が高まる
- セキュリティ・権限チェックを安全に設計できる
- バグや予期せぬ挙動を防ぎやすくなる
というメリットが得られます。
実務の Power Query では、null は必ずと言っていいほど登場しますので、 ぜひ「null を特別な値として意識し、明示的に扱う」習慣を身につけていただきたいです。
