4

クエリを書いています

SELECT * FROM EMPLOYEES WHERE EMP_ID IN (10,5,3,9,2,8,6)

結果が次の順序になるようにしたい

Emp_id   Emp_Name
10       John
5        Joe
3        Tippu
9        Rich
2        Chad
8        Chris
6        Rose

基本的にIN句と同じ順序です。それは可能ですか?私にお知らせください。

PS:SQLで実行するか、LINQを使用できる場合は結果セットを取得した後、フロントエンドオプションでソートすることもできます(フロントエンドの配列にEmp IDがあります)

ありがとう

4

2 に答える 2

4

文字列コメントの回答。これにより、元の回答と同じ結果が得られますが、文字列が一致します。

  string orgList = "John,Joe,Tippu,Rich,Chad,Chris,Rose";
  List<string> orderArray = new List<string>(orgList.Split(",".ToCharArray()));

  // the linq to do the ordering
  var result = ourList.OrderBy(e => {
     int loc = orderArray.IndexOf(e.Name);
     return loc == -1? int.MaxValue: loc;
  });

補足として、元の答えはおそらく次の2行の方が良かったでしょう:

  string orgList = "10,5,3,9,2,8,6";
  List<int> orderArray = new List<int>(orgList.Split(",".ToCharArray()));

整数定数を使用する代わりに。上記のコードを使用すると、整数の任意のコンマ区切りリストで並べ替えられます。

以下の Linq のソリューションでは、次の結果が得られます。

ここに画像の説明を入力

void Main()
{
  // some test data
  List<Person> ourList = new List<Person>() 
  {
    new Person() { ID = 1, Name = "Arron" },
    new Person() { ID = 2, Name = "Chad" },
    new Person() { ID = 3, Name = "Tippu" },
    new Person() { ID = 4, Name = "Hogan" },
    new Person() { ID = 5, Name = "Joe" },
    new Person() { ID = 6, Name = "Rose" },
    new Person() { ID = 7, Name = "Bernard" },
    new Person() { ID = 8, Name = "Chris" },
    new Person() { ID = 9, Name = "Rich" },
    new Person() { ID = 10, Name = "John" }
  };

  // what we will use to order
  List<int> orderArray = new List<int>(){10,5,3,9,2,8,6};

  // the linq to do the ordering
  var result = ourList.OrderBy(e => {
     int loc = orderArray.IndexOf(e.ID);
     return loc == -1? int.MaxValue: loc;
  });

  // good way to test using linqpad (get it at linqpad.com
  result.Dump();
}

// test class so we have some thing to order
public class Person
{
   public int ID { get; set; }
   public string Name { get; set; }
}

元の悪い SQL の回答

WITH makeMyOrder
(
   SELECT 10 as ID, 1 as Ord
     UNION ALL
   SELECT 5 as ID, 2 as Ord
     UNION ALL
   SELECT 3 as ID, 3 as Ord
     UNION ALL
   SELECT 9 as ID, 4 as Ord
     UNION ALL
   SELECT 2 as ID, 5 as Ord
     UNION ALL
   SELECT 8 as ID, 6 as Ord
     UNION ALL
   SELECT 6 as ID, 7 as Ord
),
SELECT * 
FROM EMPLOYEES E
JOIN makeMyOrder O ON E.EMP_ID = O.ID
ORDER BY O.Ord
于 2013-10-23T02:47:26.327 に答える
2

Linq-To-SQL には、これを行うために押すことができる魔法のボタンがありませんか? :-)

SQL Server でこれを行うには、リストをセットにして順序維持する関数が必要です。この猫の皮を剥ぐ方法はたくさんあります。ここに1つあります:

CREATE FUNCTION dbo.SplitInts_Ordered
(
    @List       VARCHAR(MAX),
    @Delimiter  VARCHAR(255)
)
RETURNS TABLE
AS
    RETURN (SELECT [Index] = ROW_NUMBER() OVER (ORDER BY Number), Item 
    FROM (SELECT Number, Item = CONVERT(INT, SUBSTRING(@List, Number, 
        CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number))
      FROM (SELECT ROW_NUMBER() OVER (ORDER BY [object_id])
        FROM sys.all_objects) AS n(Number)
    WHERE Number <= CONVERT(INT, LEN(@List))
      AND SUBSTRING(@Delimiter + @List, Number, LEN(@Delimiter)) = @Delimiter
    ) AS y);
GO

今、あなたはただ言うことができます:

DECLARE @list VARCHAR(MAX);

SET @list = '10,5,3,9,2,8,6';

SELECT e.Emp_Id, e.Emp_Name -- never use * in production code
  FROM dbo.Employees AS e -- always use schema prefix
  INNER JOIN dbo.SplitInts_Ordered(@list, ',') AS x
  ON x.Item = e.Emp_Id
  ORDER BY x.[Index];

はるかに優れた方法は、カンマ区切りのリストを渡すのをやめて、テーブル値パラメーターを使用することです。これは一連のものであり、文字列や JSON のわいせつ物ではありません。C# コードで、リストと順序の 2 つの列を持つ DataTable を作成します。次に、テーブル タイプを作成します。

CREATE TYPE dbo.SortedList AS TABLE(ID INT, [Order] INT);

次に、これをパラメーターとして受け取るストアド プロシージャ:

CREATE PROCEDURE dbo.GetTheList
  @x dbo.SortedList READONLY
AS
BEGIN
  SET NOCOUNT ON;

  SELECT e.Emp_Id, e.Emp_Name
    FROM dbo.Employees AS e
    INNER JOIN @x AS x
    ON x.ID = e.Emp_Id
    ORDER BY x.[Order];
END
GO

Linq-To-SQL でこれを実行できるかどうかはわかりません。物事がとても簡単になるため、人々はすぐに Linq の時流に乗っているようです。まあ、実際に何もする必要がない限り。

于 2013-10-23T02:47:01.833 に答える