hene

hene.dev

BigQuery の CAST 関数で数値フォーマット時に ### が表示される問題と解決法

BigQuery の CAST 関数で数値フォーマット時に ### が表示される問題と解決法

BigQueryCAST 関数 を使って STRING FORMAT を指定する際、 指定したフォーマットパターンの桁数を超える値が入力されるとハッシュ記号(#)で埋められる現象について検証し、 対策を考えました。

背景

BigQuery Console で桁数の多い数値が読みづらかったため、3 桁区切りのカンマ付きの数値に変換することにしました。 しかし、CAST 関数を使った際にハッシュ記号(#)で埋められる問題に遭遇したため、調査を行いました。

検証用クエリ

以下のクエリで、異なる桁数の数値に対して CAST 関数FORMAT 関数 を実行したときの違いを比較します。

with records as (
  select
    'a' as text
    , 9999 as number1
    , 9999.999 as number2
  union all
  select
    'b' as text
    , 1111 as number1
    , 1111.111 as number2
  union all
  select
    'b' as text
    , 2222 as number1
    , 2222.222 as number2
  union all
  select
    'c' as text
    , 999999999 as number1  -- 9桁の数値(問題が発生する)
    , 999999999.999 as number2
)

select
  text

  -- number1: 整数値のフォーマット比較
  -- * CAST 関数でのフォーマット(桁数制限あり)
  , cast(sum(number1) as string format '999,999') as cast_number1
  -- * FORMAT 関数(桁数制限なし、3 桁区切りのカンマ付き)
  , format("%'d", sum(number1)) as format_number1

  -- number2: 小数値のフォーマット比較
  -- * CAST 関数でのフォーマット(桁数制限あり)
  , cast(sum(number2) as string format '999,999.999') as cast_number2
  -- * FORMAT 関数(桁数制限なし、小数点後 3 桁、3 桁区切りのカンマ付き)
  , format("%'.3f", sum(number2)) as format_number2
from records
group by
  text

実行結果

クエリの実行結果

問題となる現象の詳細

整数値の場合(number1)

  • cast(sum(number1) as string format '999,999')
  • フォーマットパターン 999,999 は 6 桁までの値しか対応できない
  • number1 が 7 桁以上の値(例: 9,999,999 以上)になると、###,### と表示

小数値の場合(number2)

  • cast(sum(number2) as string format '999,999.999')
  • フォーマットパターン 999,999.999 は小数点前 6 桁、小数点後 3 桁まで対応
  • この桁数を超える値が入ると、同様に ###,###.### と表示

根本原因

CAST 関数STRING FORMAT は、 指定されたパターンの桁数が固定されており、 それを超える値を表現できない場合にハッシュ記号で置き換えられる仕様になっています。

解決策

1. FORMAT 関数を使用(推奨)

桁数が不明な場合は、FORMAT 関数を使用することで桁数制限を回避できます。

-- 整数値の場合
format("%'d", sum(number1)) -- 桁数制限なし、3 桁区切りのカンマ付き

-- 小数値の場合
format("%'.3f", sum(number2)) -- 桁数制限なし、小数点後 3 桁、3 桁区切りのカンマ付き

2. CAST 関数で十分な桁数を確保

CAST 関数を使い続けたい場合は、想定される最大桁数に対応したフォーマットパターンを指定します。

-- 12 桁まで対応
cast(sum(number1) as string format '999,999,999,999')

-- 小数点前 12 桁、小数点後 3 桁まで対応
cast(sum(number2) as string format '999,999,999,999.999')

まとめ

BigQuery で数値を 3 桁区切りでフォーマットする際の選択指針

  1. FORMAT 関数 を優先的に使用する
  • 桁数制限がなく、動的に対応可能
  • より柔軟で保守性が高い
  1. CAST 関数 を使用する場合の注意点
  • 想定される最大桁数を考慮してフォーマットパターンを設計する
  • ハッシュ記号で埋められる現象を避けるため、十分な桁数を確保する

参考

関連記事