PostgreSQL│明示的な型キャストについて(データ型変換)

今回は、PostgreSQLで明示的に型変換をするためのCAST関数について説明します。

このCAST関数については、PostgreSQL特有の関数ではなく、標準SQLで定められた関数なのですが、当サイトでMySQLとPostgreSQLを使っている限りでは、MySQLは積極的に暗黙のキャスト(自動的な型変換)を行っている印象ですが、PostgreSQLは暗黙のキャストに消極的なようです。

エラー。明示的なキャストが必要。

この記事では、PostgreSQLで明示的な型キャストをするためのCAST関数について説明します。

目次

SQLのキャストとは

SQLのキャストとは、明示的にデータ型を変換することです。

キャストとはデータ型の変換

たとえば、比較演算子を用いた下記の条件式をご覧ください。

postcode > 0110923

[postcode]とは、あるテーブルで郵便番号が格納されている列名です。

よって、この式は、『0110923より大きい郵便番号を表す条件式であることが分かりますが、この列[postcode]のデータ型の定義がCHAR型であれば、文字列を対象に不等式を使っていることになりますので、通常はエラーになります。

ただし、実際のテーブルに登録されているデータが規則性を保っているのであれば、「0110923」を数字に読み替えることもできるはずです。

今回の記事で説明するCAST関数は、このようにCHAR型をINTEGER型に変換するときなどに使う関数なのです。

暗黙的キャスト

暗黙的キャストとは、前節で紹介したようなケースにおいて、RDBMSが自動的に型変換を行うことをいいます。

実際に、列[postcode](CHAR型)に対して、不等式を用いたSQL文を実行したときの画像をご覧ください。なお、実行したSQL文は下記の通りです。

SElECT * FROM Zipcode WHERE postcode > 0110923;

MySQL

暗黙的キャストが行われた

PostgreSQL

エラーが発生した

MySQLとPostgreSQLには、同じテーブルが登録されており、同じSQL文を実行したにも関わらず、MySQLでは意図通りの結果が返されているのに対し、PostgreSQLではエラーが発生しています。

この結果は、暗黙的キャストが行われたかどうかの違いのみです。

エラー内容(PostgreSQL)

HINT:指定した名称と引数の型に合う演算子がありません。明示的な型キャストが必要かもしれません。

暗黙的キャストについて補足

「暗黙的キャスト」が行われるかどうかについては、RDBMSの優劣を決定付ける要素ではありません。厳密なSQL文において、暗黙的に変換することは必ずしも標準的とは言えないのです。

SQL_CAST関数の使い方

それでは本題のCAST関数の使い方について。ここでは、列全体を対象にデータ型を変換するケースで説明します。

基本文法

列をCASTする場合
CAST(列名 AS 変換後のデータ型)

実際のSQL文

SELECT * FROM Zipcode WHERE CAST(postcode AS INTEGER) > 0110923;

PostgreSQLでCAST関数を使った実例

CAST前(エラー)
SELECT * FROM Zipcode WHERE postcode > 0110923;
CAST後
SELECT * FROM Zipcode WHERE CAST(postcode AS INTEGER) > 0110923;

あとがき

今回は、主にPostgreSQLを対象にしたSQLの型変換、CAST関数の使い方について記事にしました。

本文で紹介した暗黙のキャストは、RDBMSのバージョンによって、機能する頻度が高まったり低まったりすることもあります。

よって、暗黙のキャストが行われているSQL文であっても、バージョンアップによりエラーが発生するようになることも想定されるのです。

その際は、当記事で説明した明示的なキャストをすることで、エラーを回避することができます。

目次