---
title: typesql の型
description: typesql のスカラー型、複合型、JSON 型、テーブル型、null 許容性、マスク型を参照します。
species: reference
---
# typesql の型

typesql はレイクの物理的な型を反映し、式の中だけで使う複合型を追加します。型は値を説明するもので、値を変更することはありません。

## スカラー型

| 型 | 意味 |
|---|---|
| `boolean` | `true` または `false` |
| `integer` | 符号付き 64 ビット整数 |
| `decimal(p, s)` | 最大精度 38 桁の正確な十進数 |
| `float` | 64 ビット浮動小数点数 |
| `date` | 暦上の日付 |
| `datetime` | オフセットのないタイムスタンプ。マイクロ秒精度で保存 |
| `datetimetz` | 特定の時点。マイクロ秒精度で保存 |
| `string` | UTF-8 テキスト |
| `json` | 構造を宣言していない JSON |
| `binary` | 正規の base64 テキストで表すバイナリ値 |

`unknown` は、検証器に十分な根拠がないことを意味します。`never` は、値を生成できない経路を表します。

## null 許容性

レイクの値は、カタログから現在の非 null の根拠が得られない限り、null を許容します。末尾の `!` は非 null の値を要求します。

```typesql
select id satisfies string!
from titan.stripe.customers
where id is not null
```

`is not null` などの述語は、有効なフロースコープ内で値を絞り込みます。キャストだけでは、結果が非 null であることの証明にはなりません。

## 複合型

式の中で使うコレクションには `list<T>`、`struct{field: T}`、`map<K, V>` があります。テーブルの構造は、順序付きの列に名前を付けて定義します。

```typesql
with customer_totals(customer_id: string!, revenue: decimal(18, 2)) as (
  select customer, sum(amount) / 100.0
  from titan.stripe.charges
  group by customer
)
select * from customer_totals
```

## 構造付き JSON

`json<{...}>` は、JSON の実行時の表現を維持しながら、その内部で利用できるフィールドを記述します。

```typesql
select metadata satisfies json<{campaign: string, cohort: string}>
from titan.stripe.customers
```

コネクターの構造定義パッケージから、これらの構造を名前で利用できるため、クエリごとに繰り返す必要はありません。

## マスク型

`masked<T>` は列ポリシーの由来を記録します。キャストで除去したり、通常の値として比較したり、マスクのない分岐と統合したりすることはできません。失敗時には、キャストに `TS0410`、比較に `TS0411`、安全でないフローに `TS0412` を使います。互換性のある射影と `union all` は、このラッパーを維持します。
