bugfix> mysql > 投稿

次のようなクエリでは、たとえデフォルトであっても、デフォルトは最小のIDから最大のIDの順に返されます。 IN リストはその順序ではありません。私の状況では、リストはいくつかのc#コードから提供されます。

結果セットを値の順序で並べ替えるにはどうすればよいですか? IN リスト?

私が持っているもの:

SELECT * FROM example Where Id in (1,3,2);
returns: 
|---------------|---------------|
|       id      |    Value      |
|---------------|---------------|
|       1       |   example1    |
|---------------|---------------|
|       2       |   example2    |
|---------------|---------------|
|       3       |   example3    |
|---------------|---------------|

私が欲しいのは:

SELECT * FROM example Where Id in (1,3,2)
         Order By "Magic code here";
returns: 
|---------------|---------------|
|       id      |    Value      |
|---------------|---------------|
|       1       |   example1    |
|---------------|---------------|
|       3       |   example3    |
|---------------|---------------|
|       2       |   example2    |
|---------------|---------------|

回答 1 件
  • これには2つの方法があります(ここのフィドルを参照)。

    CREATE TABLE ex
    (
      id INTEGER AUTO_INCREMENT PRIMARY KEY,
      value VARCHAR(10) NOT NULL
    );
    
    

    テーブルに入力します。

    INSERT INTO ex (value) VALUES
    ('example1'), ('example2'), ('example3');
    
    

    そして「マジックソース」...

    SELECT * FROM ex ORDER BY field (id, 1, 3, 2);
    
    

    結果:

    id  value
    1   example1
    3   example3
    2   example2
    
    

    これは非標準のMySQL「トリック」です。

    これを行う標準準拠の方法は次のとおりです。

    SELECT * FROM ex
    ORDER BY 
      CASE id
        WHEN 1 THEN 1
        WHEN 2 THEN 3
        WHEN 3 THEN 2
      END;
    
    

    結果:

    id  value
    1   example1
    3   example3
    2   example2
    
    

    こちらのPostgreSQLフィドルをご覧ください。 PostgreSQLは(おそらく)ほとんどの標準準拠のRDBMSシステムが存在するため、比較のために使用しました。

    PSフォーラムへようこそ!

あなたの答え