2017-09-21 7 views
0

私は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 

今の場合:

  1. 変更(文字列から)WHEN 1 = 0 THEN内部の "質" の値をintに "品質" の列をキャスト後者の場合に(真なることはありません)1 = 0文を削除しますQUALITY END DESCを他の数値列に設定する

ステートメントは正しく動作し、整数形式でSTATで出力をソートします。私は理解しようとしています

はなぜのMySQL(MariaDB)文字列の方法でSTAT整数型の列をソートすることを決定である場合におけるCASE/ BY ORDER内部文が含まれている場合は、文字列型の列他のいつかとこれが起こらない方法を見つける。

マリア

+0

MariaDBは、クエリの構造を分析してクエリを実行する方法を決定します。特に最初に行を検索せず、すべての整数であることを確認してから、順序を動的に決定します。クエリには、次のように記載されています。だからMariaDBはそれをキャストすることを(計画段階で)決定します。はい、それはそのケースを最適化することができます - しかし、一方で、そうすることができます。オプティマイザは、すべてのトリックの質問を見つけるためのものではありません。開発者がそれを非常に重要なものと見なすことは疑いがありますが、機能要求を追加することができます(MariaDBは 'where = clause 'に' 1 = 0'のようなものを実際に見つけることができます)。 – Solarflare

+0

こんにちはSolarflareので、CASE文で返される変数のタイプに応じて、私のクエリが正しい方法でそれを注文する方法はありませんか? :( –

+0

あなたの特定のクエリではうまくいくオプションがいくつかリストされていますが、MariaDBにint型であると伝えるとint型としてソートされます。可能な場合は特定の現実問題を追加する必要があります(あなたは、変数に応じてプロシージャ内で動的順序付けのようなことをしたいと思うと思います(例: '... when @order_by_setting = 1 then ...')?) – Solarflare

答えて

1

パント。そうしないでください。

私は1=1となり、1=0は、どの列を注文するのかを制御しようとしています。

:あなたはコンボが必要な場合は、これらのいずれかを生成するために十分にスマートであること、それは

ORDER BY stat 

または

ORDER BY quality 

を生成し、いずれかのように、あるいは - ほんの少し賢く、あなたのコードを作ります

ORDER BY stat, quality 
ORDER BY quality, stat 
+0

これは金のアイデアのリック・ジェイムスです。ありがとう!だから私はMySQL/MariaDBがどのように動作し、私が発見した動作が完全に正常であると仮定しますか? –

+0

@MariaNowinska - これは一般的なコンパイラの問題です。式(あなたの例では 'CASE ...')は、あらかじめ決められた単一のデータ型を持つ必要があります。 –

関連する問題