今回は、PostgreSQLで明示的に型変換をするためのCAST関数について説明します。
このCAST関数については、PostgreSQL特有の関数ではなく、標準SQLで定められた関数なのですが、当サイトでMySQLとPostgreSQLを使っている限りでは、MySQLは積極的に暗黙のキャスト(自動的な型変換)を行っている印象ですが、PostgreSQLは暗黙のキャストに消極的なようです。
この記事では、PostgreSQLで明示的な型キャストをするためのCAST関数について説明します。
SQLのキャストとは、明示的にデータ型を変換することです。
たとえば、比較演算子を用いた下記の条件式をご覧ください。
postcode > 0110923
[postcode]とは、あるテーブルで郵便番号が格納されている列名です。
よって、この式は、『0110923より大きい郵便番号』を表す条件式であることが分かりますが、この列[postcode]のデータ型の定義がCHAR型であれば、文字列を対象に不等式を使っていることになりますので、通常はエラーになります。
ただし、実際のテーブルに登録されているデータが規則性を保っているのであれば、「0110923」を数字に読み替えることもできるはずです。
今回の記事で説明するCAST関数は、このようにCHAR型をINTEGER型に変換するときなどに使う関数なのです。
暗黙的キャストとは、前節で紹介したようなケースにおいて、RDBMSが自動的に型変換を行うことをいいます。
実際に、列[postcode](CHAR型)に対して、不等式を用いたSQL文を実行したときの画像をご覧ください。なお、実行したSQL文は下記の通りです。
SElECT * FROM Zipcode WHERE postcode > 0110923;
MySQLとPostgreSQLには、同じテーブルが登録されており、同じSQL文を実行したにも関わらず、MySQLでは意図通りの結果が返されているのに対し、PostgreSQLではエラーが発生しています。
この結果は、暗黙的キャストが行われたかどうかの違いのみです。
HINT:指定した名称と引数の型に合う演算子がありません。明示的な型キャストが必要かもしれません。
「暗黙的キャスト」が行われるかどうかについては、RDBMSの優劣を決定付ける要素ではありません。厳密なSQL文において、暗黙的に変換することは必ずしも標準的とは言えないのです。
それでは本題のCAST関数の使い方について。ここでは、列全体を対象にデータ型を変換するケースで説明します。
列をCASTする場合
CAST(列名 AS 変換後のデータ型)
SELECT * FROM Zipcode WHERE CAST(postcode AS INTEGER) > 0110923;
今回は、主にPostgreSQLを対象にしたSQLの型変換、CAST関数の使い方について記事にしました。
本文で紹介した暗黙のキャストは、RDBMSのバージョンによって、機能する頻度が高まったり低まったりすることもあります。
よって、暗黙のキャストが行われているSQL文であっても、バージョンアップによりエラーが発生するようになることも想定されるのです。
その際は、当記事で説明した明示的なキャストをすることで、エラーを回避することができます。