最近仕事でsqlを直す機会がありました。
私はA5sqlを愛用していますので、そちらで動作を確認。
手を付ける前に、現状どのような結果を返してくるのかな?
とsqlを実行する。
すべてNULL
でも本番で運用されているsqlだから、そこまで致命的に間違えているとは考えにくい。
なんでだろう。
調べる…
whereが厳しすぎる?
ONLY_FULL_GROUP_BY を無効化?
手持ちのデータがおかしい?
3時間経過。。
たどり着いた結論は
A5sqlでは変数の宣言方法がSETではないということでした。
マジカヨ。。
例
以下のようなデータがあるとします。
id created_at
2 2024-06-30
3 2024-07-01
4 2024-07-02
5 2024-07-03
6 2024-07-04
こちらのデータをcreated_atで取り出すために、変数を使ってSQLを作成します
SELECT *
FROM examples
WHERE created_at >= @from
AND created_at <= @to
@from と @to は日付が入る変数となります。
通常のsqlでは以下のように書くことで変数を宣言できます。
SET @変数名 = 値;
実際に試してみます
-- 変数を宣言
mysql> SET @from = '2024-07-01';
Query OK, 0 rows affected (0.00 sec)
-- 変数を宣言
mysql> SET @to = '2024-07-02';
Query OK, 0 rows affected (0.00 sec)
-- 実行
mysql> SELECT *
-> FROM examples
-> WHERE created_at >= @from
-> AND created_at <= @to;
--結果
+----+-------------+------------+------------+---------------------+---------------------+
| id | category_id | title | text | created_at | updated_at |
+----+-------------+------------+------------+---------------------+---------------------+
| 3 | 1 | テスト2 | テスト2 | 2024-07-01 | 2024-07-04 |
| 4 | 1 | テスト3 | テスト3 | 2024-07-02 | 2024-07-04 |
+----+-------------+------------+------------+---------------------+---------------------+
2 rows in set (0.00 sec)
ちゃんと値が取得できていますね!
ところがこれを5Asqlで実行すると
SET @from = '2024-07-01';
SET @to = '2024-07-02';
SELECT *
FROM examples
WHERE created_at >= @from
AND created_at <= @to;
結果
id category_id title text created_at updated_at
5 1 テスト4 テスト4 2024/07/03 2024/07/04
2024/07/01~2024/07/02で指定しているのに2024/07/03のレコードが取れてしましました。
なぜか?
冒頭でも話したようにA5sqlでは変数の宣言方法がSETではないからです。
ではどこで変数を宣言するかというと、SQLパラメータをメニューから設定します!
ちなみに実行したときはこのような設定になっていました。
SET @from = '2024-07-01';
SET @to = '2024-07-02';
SETの部分は見事無視されて、SQLパラメータの方を見ていますね。
せめてsql実行時に「A5sqlではSETは無効です」とかメッセージを出してくれたら嬉しいです!
いかにも「正常にできてますぅ」の雰囲気のメッセージしか出ないので。。
みなさんはこんなんで時間を無駄にしないようにしてくださいね。。
目標は毎日更新
子どもの成長にあやかれるように、ブログも成長させたく、【つぶやき】シリーズで15分で書ける分量を日々更新していくように頑張ろうと思います。