PostgreSQLのCAST関数とは?実例付きでわかりやすく解説

※本サイトにはプロモーション・広告が含まれています。

(最終更新月:2023年9月)

✔このような方へ向けて書かれた記事となります

「PostgreSQLのCAST機能って何ができるのだろうか?」
「PostgreSQLのCASTの書き方が知りたい」
「PostgreSQLのCASTの実例が見たい」

✔当記事を通じてお伝えすること

  • PostgreSQLのCAST機能の基本
  • PostgreSQLのCASTの書き方やその応用
  • PostgreSQLのCASTの実例

当記事では、PostgreSQLのCAST機能の基本から、そのオプションを駆使した応用的な使い方まで、具体例を用いてわかりやすく解説しています。

ぜひ最後までご覧ください。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロジェクトマネージャー/SE(元外資系金融機関営業)

【副業】ブログ(月間15万PV)/YouTube/Web・アプリ制作

コミュニケーション × ビジネススキル × 文章力 × プログラミングスキルを活かし、30後半からのIT系職へシフト。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

CAST機能の基本

CAST関数の基本から見ていきましょう。

使い方を理解するためには、まず基本となる構文と、それを用いてどのようにデータ型を変換できるのかを理解してください。

  • PostgreSQLとCAST関数の重要性
  • 基本構文
  • 代表的なデータ型への変換

PostgreSQLとCAST関数の重要性

PostgreSQLは、豊富な機能と高い拡張性を持つオープンソースのリレーショナルデータベース管理システムです。

その中でも、CAST関数は注目すべき機能といえるでしょう。

なぜならCAST関数は、あるデータ型から別のデータ型へと変換できる非常に便利な機能だからです。

異なるデータ型を持つデータ間での計算が可能になったり、表示形式を自由に変えたりできます。

その使用方法と実践例を通じて、CAST関数の利用の重要性を理解していきましょう。

基本構文

CAST関数の基本的な構文はこちら。

CAST(変換元 AS 変換先の型)

例えば整数の1を文字列に変換したい場合、 CAST(1 AS TEXT) のように記述します。

-- 整数を文字列に変換する
SELECT CAST(1 AS TEXT) AS converted_value;

代表的なデータ型への変換

さまざまなデータ型への変換が可能なCAST関数ですが、頻繁に使用されるのは以下の変換です。

  • 数値から文字列
  • 文字列から日付や時間

例えば年齢データを文字列として連結する場合や、文字列形式の日付データを日付型に変換する場合など、非常に多岐にわたります。

-- 数値から文字列への変換
SELECT CAST(age AS VARCHAR) AS age_text
FROM users;

-- 文字列から日付への変換
SELECT CAST('2023-06-07' AS DATE) AS converted_date;

実践例:データ型変換の活用

こちらでは具体的な使用例を通じて、CAST関数の使い方をより深く理解していきましょう。

  • 文字から数値へ変換する例
  • 数値から文字へ変換する例
  • 文字から日付・時刻型へ変換する例

文字から数値へ変換する例

最初に文字列から数値への変換の例を紹介します。

‘123’という文字列を整数に変換するには、次のようにCAST関数を使いましょう。

SELECT CAST('123' AS INTEGER);

実行すると、’123’という文字列が123という整数に変換されます。

この操作は、文字列形式の数字を実際の数値として扱いたいときなどに非常に便利です。

数値から文字へ変換する例

次に数値から文字列への変換の例を見ていきましょう。

整数の123を文字列に変換するには次のようにCAST関数を使用します。

SELECT CAST(123 AS TEXT);

実行すると、123という整数が’123’という文字列に変換されます。

数値を文字列として連結したいときや、数値をテキストフィールドに表示したいときなどに有用です。

文字から日付・時刻型へ変換する例

文字列から日付・時刻型への変換例も見ていきましょう。

‘2023-06-19’という文字列を日付型に変換するには次のようにCAST関数を使用します。

SELECT CAST('2023-06-19' AS DATE);

実行すると、’2023-06-19’という文字列が2023年6月19日という日付に変換されます。

文字列形式で提供される日付・時刻データを、日付・時刻の計算や比較に使用するためにはこの操作が必要です。

型変換操作のまとめ

それぞれの型変換操作の要点をまとめます。

具体的な操作方法については、上記の「実践例:データ型変換の活用」をご参照ください。

  • 文字 ⇒ 数値
  • 文字 ⇒ 日付
  • 文字 ⇒ タイムスタンプ
  • 数値 ⇒ 文字
  • 数値 ⇒ 日付

文字 ⇒ 数値

文字列から数値への変換は、文字列形式の数字を数値として扱いたいときに用いてください。

具体的な使用例としては、数値の計算や、数値型を必要とする関数に文字列型の数値を渡す場合などが考えられます。

-- 文字列から数値への変換
SELECT CAST('123' AS INTEGER) AS converted_number;

-- 数値計算での利用
SELECT CAST('10' AS INTEGER) + CAST('5' AS INTEGER) AS sum;

文字 ⇒ 日付

文字列から日付への変換は、文字列形式の日付を日付型として扱いたいときに用います。

これにより、日付の計算や比較など、日付型特有の操作が可能です。

-- 文字列から日付への変換
SELECT CAST('2022-01-01' AS DATE) AS converted_date;

-- 日付計算での利用
SELECT CAST('2022-01-01' AS DATE) + INTERVAL '1 month' AS future_date;

文字 ⇒ タイムスタンプ

文字列からタイムスタンプへの変換です。

文字列形式の日付時刻をタイムスタンプ型として扱うことで、日付と時刻の両方を扱えます。

-- 文字列からタイムスタンプへの変換
SELECT CAST('2022-01-01 12:34:56' AS TIMESTAMP) AS converted_timestamp;

数値 ⇒ 文字

数値から文字への変換です。

例えば数値をテキストフィールドに表示したい場合や、文字列としての連結が必要な場合などに使用します。

-- 数値から文字列への変換
SELECT CAST(12345 AS VARCHAR) AS converted_text;

数値 ⇒ 日付

数値から日付への変換は、数値形式の日付(例えば、20230619)を日付型として扱いたい場合に使用します。

ただし、このような変換は一部の特殊なケースに限られ、通常は文字列から日付への変換を使用してください。

-- 数値から日付への変換
SELECT TO_DATE(CAST(20230619 AS VARCHAR), 'YYYYMMDD') AS converted_date;

型変換に関する注意点

CAST関数を使った型変換には注意が必要です。

エラーの原因となる事例と、それに対する対処法、また明示的な型変換と暗黙的な型変換の違いについて解説します。

  • エラー原因と対処方法
  • 明示的変換と暗黙的変換の違い

エラー原因と対処方法

型変換エラーの一般的な原因としては、変換前のデータが新しい型に対応していない場合があります。

例えば、‘123abc’という文字列を整数に変換しようとした場合、非数値文字が含まれていることがエラーの原因です。

また’2023-13-01’のような存在しない日付を日付型に変換しようとした場合もエラーが発生します。

このような問題に遭遇した場合、まずは変換前のデータを確認し、適切な形式であることの確認が必要です。

明示的変換と暗黙的変換の違い

データ型の変換には、明示的な変換と暗黙的な変換の2種類が存在します。

  • 明示的な変換:上記で説明したようなCAST関数を使用
  • 暗黙的な変換:PostgreSQLが必要に応じて自動的におこなう

例えば、整数値と小数値を加算すると、結果は自動的に小数値となります。

暗黙的な変換は自動的におこなわれるため、予期せぬ結果を生むこともあるでしょう。

型変換が必要な場合は、可能な限りCAST関数を使用した明示的な方法がおすすめです。

PostgreSQLについてより詳しくなるために

PostgreSQLを使いこなすためには、以下のようなことも知っておきましょう。

  • PostgreSQLで頻出するデータ型の一覧
  • PostgreSQLで利用できる日付・時刻関数の使い方
  • SQLの型変換でよく出るエラーとその対処法

PostgreSQLで頻出するデータ型の一覧

PostgreSQLでは、さまざまなデータ型を使用して、データを表現できます。

以下に、PostgreSQLでよく使われるデータ型の一覧とその特徴を示します。

  1. INTEGER: 整数
    4バイトの範囲内で整数を格納できます。
  2. DECIMAL: 任意の精度を持つ数値
    数値計算が必要な場合によく使用されます。
  3. VARCHAR(n): 文字列
    nは文字列の最大長を示します。
  4. TEXT: 長い文字列
    Varcharと異なり、長さの制限がありません。
  5. DATE: 日付
    ‘YYYY-MM-DD’の形式で表されます。
  6. TIMESTAMP: 日時
    ‘YYYY-MM-DD HH:MI:SS’の形式で表されます。

これらのデータ型は、表の定義やデータの挿入、検索などで使用されます。

それぞれのデータ型に適した操作で、効率的なデータ処理の実現が可能です。

PostgreSQLで利用できる日付・時刻関数の使い方

日付や時刻の操作は、データベースで頻繁におこなわれます。

PostgreSQLに備わっているこれらの操作を支援するための多くの関数を見ていきましょう。

以下に、よく使用される関数をいくつか紹介します。

  1. NOW(): 現在の日時を返す関数
    例えば、レコードの作成日時を記録する際によく使用されます。
  2. EXTRACT(field FROM timestamp)
    timestampから特定のフィールド(年、月、日、時間など)を抽出します。
  3. AGE(timestamp)
    現在の日時から指定された日時を引いた結果(つまり、経過時間)を返します。
  4. DATE_PART(‘field’, timestamp)
    EXTRACT関数と同様、timestampから特定のフィールドを抽出します。

これらの関数を使用することで、日付や時刻の操作を簡単におこなえます。

SQLの型変換でよく出るエラーとその対処法

SQLでデータ型を変換する際には、いくつかのエラーに遭遇する可能性があります。

そのようなエラーの一般的な原因と対処法を以下で確認してください。

  1. データ型の非互換性
    数値と文字列を混在させた演算で、非互換性のエラーが発生する可能性があります。
    この解決には、適切な型にキャスト(変換)が必要です。
  2. 数値の範囲外
    integer型の最大値を超える数値を格納しようとすると、範囲外エラーが発生します。
    これを解決するためには、大きな数値を格納できる型(たとえば、bigintやdecimal)を使用するか、数値がその型の範囲内に収まるように調整しましょう。
  3. 不正な日付・時刻形式
    ‘YYYY-MM-DD’形式ではない文字列をdate型に変換しようとすると、エラーが発生します。
    適切な形式の文字列を使用するか、文字列を適切な形式に変換する必要があります。
    たとえば、TO_DATE(text, format)関数を使用すると、指定した形式の文字列を日付に変換できます。
  4. NULL値の操作
    SQLでは、NULL値は特殊な値で、ほかの値と同じように扱うと予期しない結果につながる可能性があります。NULL値を含むカラムを数値にキャストすると、エラーが発生します。
    これを回避するためには、NULL値をチェックし、適切に処理することが必要です。
    COALESCE関数は、NULL値を他の値に置き換えるのに役立ちます。

これらのエラーは、SQLの型変換を理解し、適切に対処することで回避可能です。

型変換エラーが発生した場合は、何が問題であるかを詳細に確認し、上記のガイドラインに従って修正を試みてください。

まとめ

PostgreSQLのCAST関数を使用したデータ型変換は、非常に強力な機能で、データの扱いを柔軟にできます。

当記事では、基本的な使い方から具体的な使用例、さらにはエラー対策までを解説しました。

CAST関数を自身のSQLスキルセットに追加し、より効率的なデータ操作を行ってください。

タイトルとURLをコピーしました