SQL Server 2008 R2 を使用しています。
文字列として保持している特定の順序で結果を並べ替えたい
(文字列はプログラムで作成されます)。
次の表を検討してください。
Col1 Col2 Col3
1 Jon a
2 Joan b
3 John a
4 Jonnie b
5 Jonny a
として宣言されたnvarchar
変数が@myOrderString
あります。これには、選択したい行の順序が含まれています。
そう言えば@myOrderString = '213'
(編集済み)
だから、私はそのようなことをしたいと思います:
SELECT
ROW_NUMBER() OVER (ORDER BY @mySortString) AS Row,
( Col2 + '(' + Col1 + ')' ) AS Outcome
FROM
myTable
WHERE
Col3 = 'a'
ORDER BY
@mySortString
結果を得るために:(編集済み)
Row Outcome
1 John (3)
2 Jon (1)
3 Jonny (5)
どうすればこれを解決し始めることができますか?
PS
の値を@myOrderString
分離する必要がある場合は、作成できます@myOrderString = '2,1,3'
(編集)
質問を編集した理由:
- 文字列の内容に誤りがありました。[(編集済み)としてマーク]
- 結果に誤りがありました。Andriy M. に感謝 [(編集済み) とマーク]
- 見た目の変更を加え、いくつかの文法とタイプミスを修正しました。
明確化: (この明確化の一部は、Aaron Bertrand のコメントに基づいています)
- 文字列内の値の数は、結果の行数と常に一致します。
- 文字列の値は、常に 1 から行数までの数値です。
- 最初の結果の行は 1 としてマークされます。2 番目は 2 としてマークされ、3 番目は 3 としてマークされます。現在、文字列は結果を並べ替えるためのものです。文字列が の場合
2,1,3
、選択結果が並べ替えられたことを意味します。2 行目が最初の結果になり、最初の結果が 2 番目として表示され、3 行目が 3 番目のままになります。 - 最大行数は 15 であるため、文字列は の形式
123456789ABCDEF
にすることができます。または、この縮小形式のソリューションが単純でない場合、文字列は次の形式にすることができます。1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
多くの方々のおかげで、次の解決策にたどり着きました。
(関数やループは必要ありません)
-- creating the original table and filling it
DECLARE @t TABLE(Col1 INT, Col2 VARCHAR(22), Col3 CHAR(1));
INSERT @t VALUES
(1,'Jon', 'a'),
(2,'Joan', 'b'),
(3,'John', 'a'),
(4,'Jonnie','b'),
(5,'Jonny', 'a');
-- this is the required order of the results
DECLARE @myOrderString VARCHAR(32) = '213';
-- this is my current solution
SELECT
ROW_NUMBER()OVER (ORDER BY CHARINDEX(CAST(rr AS NVARCHAR(MAX)), @myOrderString)) As [Row],
Outcome
FROM
(
SELECT
ROW_NUMBER()OVER (ORDER BY Col1) AS rr,
Col2 + ' (' + CONVERT(NVARCHAR(22),Col1)+ ')' AS Outcome
FROM @t
WHERE Col3 = 'a'
) as r
ORDER BY
[Row]
ただし、最大 9 行の結果で機能しますが、フォームで最大 15 行を表し123456789ABCDEF
ます。
を使用して、結果の行番号に 10 進数から 16 進数への変換を使用しようとしましCONVERT(CHAR(1),CONVERT(VARBINARY(1),@Dec))
たが、うまくいきませんでした。
これが機能するために利用できる簡単な修正はありますか?
長い例 (9 行以上)
9 行を超える例をテストするために、これを使用します。
-- creating the original table and filling it
DECLARE @t TABLE(Col1 INT, Col2 VARCHAR(22), Col3 CHAR(1));
INSERT @t VALUES
(1,'Jon', 'a'),
(2,'Joan', 'b'),
(3,'John', 'a'),
(4,'Jonnie','b'),
(5,'Jonny', 'a'),
(6,'Don', 'a'),
(7,'Doan', 'b'),
(8,'Dohn', 'a'),
(9,'Donnie','b'),
(10,'Donny', 'a'),
(11,'Gon', 'a'),
(12,'Goan', 'a'),
(13,'Gohn', 'a'),
(14,'Gonnie','a'),
(15,'Gonny', 'a');
-- this is the required order of the results
DECLARE @myOrderString VARCHAR(32) = '456B213A789';
完全な解決策:
ここでは、回答セクションでループを使用して完全なソリューションを提供しますが、それをTHE回答として信用することはありません。