私はORDER BY句を持つ動的MySQLコードを持っています。テーブルには複数の列が含まれていますが、重要なものはの統計との品質です。 品質列が文字列型である一方、MySQL(10.1.24-MariaDB)ORDER BY条件オートキャスト文字列として
STAT列は、INT型のタイプのselect文で数学的計算です。
今私は、このような書を持っています:
SELECT (col1+col2+col3) as cast(STAT as unsigned), QUALITY FROM GEAR
ORDER BY CASE WHEN 1=1 THEN stat
WHEN 1=0 THEN quality END DESC
今私は、上記のシナリオのコードが整数な方法でのstat列で結果をソートすることを期待します。しかし
stat quality
1 normal
2 normal
3 better
4 better
結果が実際に表示される方法は、文字列に自動キャストされたかのようです。
stat quality
1 normal
11 normal
12 better
2 better
今の場合:
- は
- が
- 変更(文字列から)WHEN 1 = 0 THEN内部の "質" の値をintに "品質" の列をキャスト後者の場合に(真なることはありません)1 = 0文を削除しますQUALITY END DESCを他の数値列に設定する
ステートメントは正しく動作し、整数形式でSTATで出力をソートします。私は理解しようとしています
はなぜのMySQL(MariaDB)文字列の方法でSTAT整数型の列をソートすることを決定である場合におけるCASE/ BY ORDER内部文が含まれている場合は、文字列型の列他のいつかとこれが起こらない方法を見つける。
マリア
MariaDBは、クエリの構造を分析してクエリを実行する方法を決定します。特に最初に行を検索せず、すべての整数であることを確認してから、順序を動的に決定します。クエリには、次のように記載されています。だからMariaDBはそれをキャストすることを(計画段階で)決定します。はい、それはそのケースを最適化することができます - しかし、一方で、そうすることができます。オプティマイザは、すべてのトリックの質問を見つけるためのものではありません。開発者がそれを非常に重要なものと見なすことは疑いがありますが、機能要求を追加することができます(MariaDBは 'where = clause 'に' 1 = 0'のようなものを実際に見つけることができます)。 – Solarflare
こんにちはSolarflareので、CASE文で返される変数のタイプに応じて、私のクエリが正しい方法でそれを注文する方法はありませんか? :( –
あなたの特定のクエリではうまくいくオプションがいくつかリストされていますが、MariaDBにint型であると伝えるとint型としてソートされます。可能な場合は特定の現実問題を追加する必要があります(あなたは、変数に応じてプロシージャ内で動的順序付けのようなことをしたいと思うと思います(例: '... when @order_by_setting = 1 then ...')?) – Solarflare