0

選択したデータを変更する必要があるクエリがあり、そのデータの結果を制限したいと考えています。例えば:

SELECT table_id, radians( 25 ) AS rad FROM test_table WHERE rad < 5 ORDER BY rad ASC;

codeigniter によると「rad」列がないため、これがハングアップするのは「rad < 5」です。これをカスタム クエリ ($this->db->query(...)) として記述しようとしましたが、それでもできません。このフィールドに基づいて結果を制限する必要があります。ああ、WHERE フィルターを削除すると、ORDER BY は完璧に機能します。結果は、rad フィールドによる順序 ASC です。

ヘルプ!!!

4

1 に答える 1

1

多くの DBMS では、where 句で数式/式を繰り返す必要があります。

SELECT table_id, radians( 25 ) AS rad 
FROM test_table 
WHERE radians( 25 ) < 5 
ORDER BY radians( 25 ) ASC

ただし、この場合、計算列は定数であるため、クエリ自体はあまり意味がありません。ラジアン (25 * myColumn) などのように、欠落している部分はありましたか?

編集(数式の本質に関する情報など)
数式を繰り返す必要があるため、がっかりしているようです...それに関するいくつかのコメント:

式をエイリアス化するのではなく、明示的にスペルアウトする必要があるという事実は、クエリを読みにくくしたり、書くのが楽しくなくなったりする可能性があります (これについては以下で詳しく説明します)。しかし、考慮すべきより重要な要素は、式がWHERE 句により、DBMS は、基になるテーブルの潜在的にすべてのレコードに対してこの値を計算します!!!

これにより、いくつかの点でパフォーマンスが低下します。

  • SQL は一部のインデックスを使用できない場合があり、代わりにテーブル (またはその一部) をスキャンする必要があります。
  • 式が重い場合、応答が遅くなり、サーバーのスケーラビリティが低下します。

WHERE 句に述語を追加することで、SQL が [かなりの量の] レコードを除外できるようにすれば、状況はそれほど悪くはありません。このような追加の検索基準は、アプリケーションによって駆動される場合があります (たとえば、放射に関するこの条件に加えて、場所の [無関係な] 高度が 6,000 フィート未満である必要があります)、またはそのような基準を「人為的に」追加して、クエリ (たとえば、許容精度内で「ラジアン」値を計算するには不十分な大まかなヒューリスティックを知っているかもしれませんが、レコードの 70% を除外するのに十分である可能性があります。 「ラジアン」に必要な正確な範囲を満たします。

式自体を高速化するために、式自体に関するいくつかのトリックを次に示します。

  • 教科書の式を 100% 実行する必要はないことに注意してください。
    大円計算のどの部分がこのラジアン計算に関連するのかはわかりませんが、一般的な用語で言えば、一部の式には、平方根の抽出、三角関数の呼び出しなどの高価なステップが含まれています。場合によっては、の手順を述語の反対側に適用することにより (通常、1 回だけ評価する必要がある)、数式 (多くのレコード/値に対して実行する必要がある) を単純化できる場合があります。たとえば、検索条件の述語が"WHERE SQRT((x1-x2)^2 + (y1-y2)^2) > 5". 距離の計算には (二乗差の合計の) 平方根を求める必要があるため、平方根を削除し、代わりにこの修正された式の結果を元の距離値の二乗と比較することができます。つまり、"WHERE ((x1-x2)^2 + (y1-y2)^2) > (5^2)"
  • SQL/DBMS システムによっては、式をカスタム定義関数に実装できる場合があります。これにより、式がより効率的になり (「プリコンパイル」されているため、より適切な言語で記述されている可能性があるため)、式が短くなります。参照、SQL クエリ自体 (前述のように 2 回リストする必要がありますが、イベント)
  • 状況によっては、データベース スキーマと基礎となるアプリケーションを変更して、数式 (またはその一部) を事前に計算し、インデックスを作成して、DBMS で関数ベースの述語を長い間解決する必要がないようにすることもできます。
于 2009-11-17T01:35:55.740 に答える