MySQLでSTR_TO_DATEの別名(エイリアス)が見つからない場合の対処法:HAVING句の活用
MySQLでは、WHERE句の中でSELECT文で定義した列の別名(エイリアス)を参照することができず、「Unknown column」エラーが発生することがあります。このような場合、HAVING句を使うことで問題を解決できます。実際にサンプルを見ながら確認していきましょう。
1. テーブルの作成
まず、テーブルを作成します。ここでは日付を文字列(varchar型)として格納するテーブルを用意します。
mysql> create table DemoTable -> ( -> AdmissionDate varchar(100) -> ); Query OK, 0 rows affected (0.55 sec)
2. レコードの挿入
次に、insertコマンドを使っていくつかのレコードを挿入します。日付は「日/月/年」の形式で文字列として保存しています。
mysql> insert into DemoTable values('10/12/2017');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('01/11/2018');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('31/01/2019');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('09/06/2019');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('19/04/2019');
Query OK, 1 row affected (0.23 sec)3. テーブル内の全レコードを表示
select文を使って、テーブル内のすべてのレコードを表示します。
mysql> select *from DemoTable;
出力結果
+---------------+ | AdmissionDate | +---------------+ | 10/12/2017 | | 01/11/2018 | | 31/01/2019 | | 09/06/2019 | | 19/04/2019 | +---------------+ 5 rows in set (0.00 sec)
4. STR_TO_DATEとHAVING句を使ったクエリ
ここが本題です。STR_TO_DATE()関数で変換した結果に別名「newDate」を付け、その別名に対して条件を指定したい場合、WHERE句ではなくHAVING句を使用します。
mysql> select STR_TO_DATE(AdmissionDate, '%d/%m/%Y') as newDate from DemoTable -> having newDate >= '2019-01-01';
出力結果
+------------+ | newDate | +------------+ | 2019-01-31 | | 2019-06-09 | | 2019-04-19 | +------------+ 3 rows in set (0.00 sec)
ポイント解説
なぜHAVING句が必要なのでしょうか?その理由は以下の通りです。
- SQLの評価順序: SELECT句で定義した別名は、
WHERE句が評価される時点ではまだ存在しません。そのため、WHERE句で別名を参照すると「Unknown column」エラーになります。 - HAVING句の役割: HAVING句はSELECT句の後に評価されるため、別名を参照できます。本来はGROUP BYと組み合わせて集計結果を絞り込むために使われますが、このように別名へのフィルタリングにも利用可能です。
このように、STR_TO_DATE()で文字列を日付型に変換した結果をフィルタリングしたい場合は、HAVING句を使うことでスマートに実現できます。
-
MySQLのNOT NULL制約とは?空にできない列の定義方法とエラーの挙動を解説
MySQLでは、列にNULL(空の値)を許可したくない場合、テーブル定義時にNOT NULL制約を指定します。NOT NULLが設定された列にNULLを挿入しようとすると、MySQLはエラーを返し、データの登録を拒否します。NOT NULL制約を持つテーブルの作成まず、Id列とLastName列をNOT NULLとして指定したテーブルを作成してみましょう。mysql> create table DemoTable1895 ( Id int NOT NULL, FirstName varchar(20), LastName varchar(20) NOT N
-
MySQLの既存のカラムにNOT NULL制約を設定する方法
MySQLですでに存在するカラムにNOT NULL制約を追加するには、ALTER TABLE文を使用します。この記事では、実際のSQL例を使いながら、NOT NULL制約の設定方法とその動作確認の手順をわかりやすく解説します。 1. テーブルの作成 まず、検証用のサンプルテーブルを作成します。 mysql> create table DemoTable1949 ( UserId int, UserName varchar(20) ); Query OK, 0 rows affected (0.00 sec) この時点では、UserNameカラムにはNUL