web-dev-qa-db-ja.com

SQLiteとカスタムオーダー

カテゴリのあるテーブルがあります。

ID  Category
"1","Baking"   
"3","Family"   
"4","Entertaining"   
"5","Children"   
"6","Desserts"   

ここで、selectステートメントの結果を次のように注文します。

ID  Category
"4","Entertaining"   
"3","Family"  
"1","Baking"   
"5","Children"   
"6","Desserts"  

例えば。 MySQLでは、次のようにします。

SELECT * FROM CATEGORIES ORDER BY FIELD (ID, 4,3,1,5,6);

しかし、SQLiteでどのようにそれを行いますか? 「orderby」フィールドがありません。

39
ChrisB
ORDER BY 
  CASE ID
    WHEN 4 THEN 0
    WHEN 3 THEN 1
    WHEN 1 THEN 2
    WHEN 5 THEN 3
    WHEN 6 THEN 4
  END
69
Tomalak

それを行う2番目の方法(最初の方法はCASE WHEN ... THEN END他の回答ですでに述べたように)は:

ORDER BY ID=4 DESC,
         ID=3 DESC,
         ID=1 DESC,
         ID=5 DESC,
         ID=6 DESC
2
Thomas Baruchel

「orderby」フィールドがありません

何故なの?

ソート順がアプリケーション固有であるためである場合は、データベースではなくアプリケーションでソートを実行します。

並べ替え順序がこの1つのクエリに固有であるためである場合は、クエリでエンコードします。ただし、これを呼び出し元のアプリケーションに対して透過的にすることを強くお勧めします。 (標準SQL構文):

SELECT T2.ID, T2.Category, 
       T2.query_name_here_sort_order
  FROM (
        SELECT T1.ID, T1.Category, 
               CASE ID
                  WHEN 4 THEN 1
                  WHEN 3 THEN 2
                  WHEN 1 THEN 3
                  WHEN 5 THEN 4
                  WHEN 6 THEN 5
               END AS query_name_here_sort_order
          FROM CATEGORIES AS T1
       ) AS T2 (
                ID, Category, 
                query_name_here_sort_order
               )
 ORDER 
    BY query_name_here_sort_order;

並べ替え順序が複数のクエリやアプリケーションで使用されている場合は、それをデータベース内のテーブルの列に追加してから、クエリでその列を使用します。

1
onedaywhen