質問: お世話になっております。 現在以下のようなクエリが可能か調査しています。 $()で囲まれた部分は疑似コードです。所望の動作はOrder.TableTypeの値によってINNER JOINするモデルを変更しながらリストを得たいと思っています。 ``` SELECT Orders.OrderID, $(another_model).Name, $(another_model).OrderDate FROM Orders INNER JOIN $(another_table if Orders.table_type ==1: another_table=Customers else: another_table=Products) ON Orders.CustomerID=$(another_model).ID; ``` このような処理をSQLで行うことは可能でしょうか?こういうデータ構造はよくないみたいな話も聞いたので,もしこの場合のデータ構造を変更するとしたらどのようにリファクタリングするのが良いのでしょうか。 バックエンドそこまで詳しくないため,初歩的な質問かもしれませんが,よろしくお願いいたします。
回答: SQLは所詮文字列なので、可能かどうか、で言えば可能です。 しかしながら、変数にしてしまうと、SQLが実行時可変することにより、 非常に可読性が悪くなります。 作成者以外がデバッグなりテストなり、改造なりをしたとき、 非常にハマリポイントになろうかと・・。 私ならば、提示された例であれば、それぞれ、 SELECT Orders.OrderID, Customers.Name, Customers.OrderDate FROM Orders INNER JOIN Customers ON Orders.CustomerID=Customers.ID; と、 SELECT Orders.OrderID, Products.Name, Products.OrderDate FROM Orders INNER JOIN Products ON Orders.CustomerID=Products.ID; のように分離し、ターゲットを明示したいです。 更にこのとても似通ったテーブルに1つ項目を追記可能ならば、 Type列を設けて、 SELECT Orders.OrderID, Products.Name, Products.OrderDate FROM Orders INNER JOIN CustomerProducts ON Orders.CustomerID=CustomerProducts.ID AND CustomerProducts.Type = $(type) とし、$(type)にCustomerかProductかの判別を与えたいです。