オレンジのブログ
読書と運動で人生を変えよう
パソコンシリーズ

A5sqlはSETが無効だから気を付けて

最近仕事で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を作成します

SQL
SELECT *
FROM examples
WHERE created_at >= @from
AND created_at <= @to


@from と @to は日付が入る変数となります。

通常のsqlでは以下のように書くことで変数を宣言できます。

SQL
SET @変数名 = 値;

実際に試してみます

SQL
-- 変数を宣言
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で実行すると

SQL
SET @from = '2024-07-01';
SET @to = '2024-07-02';
SELECT *
FROM examples
WHERE created_at >= @from
AND created_at <= @to;

結果

SQL
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パラメータをメニューから設定します!

ちなみに実行したときはこのような設定になっていました。

SQL
SET @from = '2024-07-01';
SET @to = '2024-07-02';

SETの部分は見事無視されて、SQLパラメータの方を見ていますね。

せめてsql実行時に「A5sqlではSETは無効です」とかメッセージを出してくれたら嬉しいです!

いかにも「正常にできてますぅ」の雰囲気のメッセージしか出ないので。。

みなさんはこんなんで時間を無駄にしないようにしてくださいね。。

目標は毎日更新

子どもの成長にあやかれるように、ブログも成長させたく、【つぶやき】シリーズで15分で書ける分量を日々更新していくように頑張ろうと思います。