入力に基づいて行をフィルタリングした後にテーブルを返すストアド プロシージャがあります。入力のうち 2 つは、sort_column
と sort_dir
です。クエリは sort_dir
方向 (ASC または DESC) で ORDER BY sort_column
にする必要があります。
次のクエリを試しましたが成功しませんでした。以下のクエリは、関連する用語のみを含めるように簡略化されています。他のフィルターは問題なく機能します。
SELECT * FROM テーブル ORDER BY sort_column sort_dir
SELECT * FROM テーブル ORDER BY CASE sort_column
'col1' の場合、col1_name
WHEN 'col2' THENcol2_name END
CASE sort_dir WHEN 'asc' THEN ASC
ELSE DESC END
2 つの入力を _ 形式で 1 つの入力に接続し、次のことを試しました:
リーリーエラー #1064 が発生し続けます。上記のそれぞれのケースで異なりますが、常に「CASE」セクションを指します。これは上記のオプション 2 のバグです
##1064 - SQL 構文にエラーがあります。MySQL サーバーのバージョンのマニュアルで 4 行目の「WHEN 'col1' THENcol1_name END CASE 'asc' WHEN 'desc」を確認してください。使用する正しい構文'THEN DESC ELSE'
あたり
問題は列名ではないようです。これは機能しない並べ替え方向です。 「ASC」と「DESC」の部分を省略して上記の各オプションを試してみても、問題はありません。
ここで何か間違ったことをしているでしょうか? CASE以外にもっと良い方法はありますか?
MySQL バージョン: 5.6
最良の方法は複数の
リーリーケース
:長く感じるかもしれません。ただし、
CASE
は単一の値を返す式であることに注意してください。したがって、ASC
およびDESC
をTHEN
の一部として使用することはできません。同様に重要なのは、データ型の問題です。 SQL コンパイラは、
CASE
式の単一のタイプを決定します。これにより、列の型が異なる場合に予期しない問題が発生する可能性があります。最も簡単な解決策は、複数の
CASE
式を使用することです。