MySQLでvarchar型フィールドの数値から最大値を取得する方法
はじめに
MySQLでは、数値がvarchar型(文字列型)のフィールドに保存されているケースによく出会います。このようなフィールドに対して単純にmax()関数を使うと、値が文字列として比較されるため、期待どおりの結果が得られないことがあります。
そこで役立つのが、cast()関数とmax()関数の組み合わせです。実際にテーブルを作成しながら、具体的な手順を見ていきましょう。
サンプルテーブルの作成
まず、varchar型カラムを持つテーブルを作成します。
mysql> create table findMaxValueInVarcharField
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Value varchar(200)
-> );
Query OK, 0 rows affected (1.09 sec)テストデータの挿入
続いて、INSERTコマンドを使っていくつかのレコードを挿入します。
mysql> insert into findMaxValueInVarcharField(Value) values('200');
Query OK, 1 row affected (0.14 sec)
mysql> insert into findMaxValueInVarcharField(Value) values('1000');
Query OK, 1 row affected (0.25 sec)
mysql> insert into findMaxValueInVarcharField(Value) values('899474');
Query OK, 1 row affected (0.18 sec)
mysql> insert into findMaxValueInVarcharField(Value) values('39474');
Query OK, 1 row affected (0.15 sec)
mysql> insert into findMaxValueInVarcharField(Value) values('4958');
Query OK, 1 row affected (0.12 sec)登録データの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select * from findMaxValueInVarcharField;
実行結果は以下のとおりです。
+----+--------+ | Id | Value | +----+--------+ | 1 | 200 | | 2 | 1000 | | 3 | 899474 | | 4 | 39474 | | 5 | 4958 | +----+--------+ 5 rows in set (0.00 sec)
varcharフィールドから数値の最大値を取得するクエリ
それが本題です。varchar型フィールド内の数値から最大値を取得するには、cast()関数で値をunsigned整数型に変換してからmax()関数に渡します。
mysql> select max(cast(Value as unsigned)) AS MaximumValueFromVarcharField from findMaxValueInVarcharField;
実行結果は以下のとおりです。
+------------------------------+ | MaximumValueFromVarcharField | +------------------------------+ | 899474 | +------------------------------+ 1 row in set (0.00 sec)
なぜcast()が必要なのか
varchar型のまま比較すると、値は「文字列」として評価されます。たとえば「200」と「1000」を比較すると、先頭の文字同士が比べられ、「2」は「1」より大きいため「200」の方が大きいと判断されてしまいます。
cast(Value as unsigned)で明示的に数値へ変換することで、桁数や先頭の文字に左右されない正しい数値比較が可能になり、真の最大値を取得できます。
まとめ
varchar型フィールドに保存された数値から最大値を取得する場合は、max(cast(カラム名 as unsigned))のようにキャストを組み合わせるのがポイントです。数値として確実に扱いたい場合は、テーブル設計段階でINT型などの数値型カラムを使うことも併せて検討するとよいでしょう。
-
MySQLのMAX()集計関数で列の最大値を取得する方法
MySQLでは、列の最大値を取得するために、あらかじめ用意されている集計関数 MAX() を使用できます。この記事では、実際にテーブルを作成し、データを挿入して、MAX()関数で最大値を取得する手順を具体的に解説します。1. テーブルの作成まず、サンプルとなるテーブルを作成します。mysql> create table DemoTable ( Id int ); Query OK, 0 rows affected (0.96 sec)2. レコードの挿入次に、INSERTコマンドを使ってテーブルにいくつかのレコードを挿入します。mysql> insert into Demo
-
MySQLで文字列フィールドの数値部分を抽出して行をグループ化する方法
MySQLでは、文字列型のフィールドに「+」演算子を使って数値の0を加算することで、文字列の先頭にある数字部分だけを数値として取り出すことができます。例えば、「9844Bob」のような文字列から、数値部分である「9844」を取得したいケースがこれに該当します。サンプルテーブルの作成まずはテーブルを作成しましょう。mysql> create table DemoTable ( StudentId varchar(100) ); Query OK, 0 rows affected (0.92 sec)テストデータの挿入INSERTコマンドを使って、いくつかのレコードを挿入します。my