この記事は最終更新日から1年以上が経過しています。
開発で下記のようなSQLを書きました。
SELECT orders.credit_order_id AS "受注番号", goods.goods_name AS "商品名", goods.goods_id AS "商品コード" FROM orders (略) ORDER_BY "受注番号" |
受注番号でソートされた結果が返ってくると思っていたのですが実際の結果は
|14641806477310300000000004 | ポストカード | dummy-0000000123| |14786037475918900000000644 | ポストカード | dummy-0000000123| |14663139217720500000000006 | ポストカード | dummy-0000000123| |14661488886492500000000046 | ポストカード | dummy-0000000123| |14651332683516000000000004 | ポストカード | dummy-0000000123| |14637111489780600000000006 | ポストカード | dummy-0000000123| |14788581321243100000000659 | ポストカード | dummy-0000000123| |14770469711138300000000514 | ポストカード | dummy-0000000123| |14663098973620600000000006 | ポストカード | dummy-0000000123| |14661486044897700000000046 | ポストカード | dummy-0000000123| (略) |
(すこし分かりにくいですが、)受注番号でソートされていません。
受注番号でソートするにはどうすればいいのでしょうか?
検索して出てきた個人ブログを何件か見てみると、ORDER_BY 句のクオートを外すと動くという記述を見つけました。
試してみます。
SELECT orders.credit_order_id AS "受注番号", goods.goods_name AS "商品名", goods.goods_id AS "商品コード" FROM orders (略) ORDER_BY 受注番号 |
|14633694676398300000000004 | ポストカード | dummy-0000000123| |14637111489780600000000006 | ポストカード | dummy-0000000123| |14641806477310300000000004 | ポストカード | dummy-0000000123| |14649450863032600000000004 | ポストカード | dummy-0000000123| |14651332683516000000000004 | ポストカード | dummy-0000000123| |14654399622344800000000004 | ポストカード | dummy-0000000123| |14661486044897700000000046 | ポストカード | dummy-0000000123| |14661488886492500000000046 | ポストカード | dummy-0000000123| |14662951280217000000000006 | ポストカード | dummy-0000000123| |14663098973620600000000006 | ポストカード | dummy-0000000123| (略) |
おお!確かに受注番号でソートされました。
が、どうしてなのでしょう…?
さらに調べてみました。
MySQL公式ドキュメントのカラムエイリアスに関する問題というページに原因が書かれていました。
ステートメント内のどこに指定する場合でも、エイリアスへの引用した参照には、識別子引用符を使用する必要があります。そうしないと、参照は文字列リテラルとして扱われます。たとえば、次のステートメントはカラム id の値によってグループ化され、エイリアス `a` を使用して参照されます。
SELECT id AS 'a', COUNT(*) AS cnt FROM tbl_name GROUP BY `a`; |
要するに「ORDER BY や GROUP BY でカラムの別名を指定する時はクオートじゃなくてバッククオートで囲む。そうでないとカラム名として見てもらえない」ということみたいです。
クオートを外したときに動いたのは… MySQL がいい感じに「察して」くれたのでしょうか?
という訳で、以下のSQLがドキュメント的に正しいものになります。
SELECT orders.credit_order_id AS "受注番号", goods.goods_name AS "商品名", goods.goods_id AS "商品コード" FROM orders (略) ORDER_BY `受注番号` |
この記事を書いた人
- まだまだ気持ちは新人です。
最近書いた記事
- 2018.03.23Windows のコンソールを使いやすくしよう
- 2018.02.23GitHubでPullRequestが出ると、Jenkinsでテストした後でEC2に自動デプロイする設定を行った
- 2018.02.21Jenkins にパラメータを渡して、Packer で引数付きビルドを行う
- 2018.01.10それ、キーボードマクロで出来ますよ(Emacs)