3
SELECT Code, Value FROM dbo.Sample

出力:

 Code     Value
 Alpha    Pig
 Beta     Horse
 Charlie  Dog
 Delta    Cat
 Echo     Fish

コードのリストを指定してシーケンス列を追加し、IN 句で指定された順序に基づいてリストを並べ替えたいと考えています。

SELECT Code, Value FROM dbo.Sample
WHERE Code in ('Beta', 'Echo', 'Alpha')

その方が簡単な場合は、コードを指定する変数を先頭に宣言することもできます。

重要なのは、指定した順序に基づいて行番号を追加することです。

出力:

 Row   Code    Value
  1    Beta    Horse
  2    Echo    Fish
  3    Alpha   Pig

編集:私のコードはすべて固定長であり、それを行う方法に大きな違いがあることに気付きました。以下の回答を正しいとマークしましたが、私の解決策は、コンマ区切りの値の文字列を使用することです。

DECLARE @CodeList TABLE (Seq int, Code nchar(3))
DECLARE @CodeSequence varchar(255)
DECLARE @ThisCode char(3)
DECLARE @Codes int
SET @Codes = 0

-- string of comma-separated codes
SET @CodeSequence = 'ZZZ,ABC,FGH,YYY,BBB,CCC'

----loop through and create index and populate @CodeList
WHILE @Codes*4 < LEN(@CodeSequence)
BEGIN
    SET @ThisCode = SUBSTRING(@CodeSequence,@Codes*4+1,3)
    SET @Codes = @Codes + 1
    INSERT @CodeList (Seq, Code) VALUES (@Codes, @ThisCode)
END

SELECT Seq, Code from @CodeList
4

5 に答える 5

4

私が正確に動作するのを見た唯一の2つの方法は次のとおりです。

最初の使用CHARINDEX法 (Gordon のものと似ていますが、WHERE ステートメントは を使用した方が正確だと思いますIN):

SELECT *
FROM Sample
WHERE Code IN ('Beta','Echo','Alpha')
ORDER BY CHARINDEX(Code+',','Beta,Echo,Alpha,')

コンマとコードを連結すると、サブマッチが結果に影響を与えないようにする必要があります。

CASEまたは、次のステートメントを使用できます。

SELECT *
FROM Sample
WHERE Code in ('Beta','Echo','Alpha')
ORDER BY CASE 
  WHEN Code = 'Beta' THEN 1
  WHEN Code = 'Echo' THEN 2
  WHEN Code = 'Alpha' THEN 3
END

SQL フィドルのデモ

サブマッチでデモを更新しました。

于 2013-03-02T01:45:50.920 に答える
2

これが任意の長さのコードリストの解決策です。自己インクリメントフィールドとコードを使用してテーブルを作成します。指定された順序で挿入します。テーブルを結合し、...で並べ替えます。

いくつかの詳細。これを読んでください。文字列(コンマで区切られた)から自動インクリメントフィールドを持つテーブルを作成する関数があります。

mysql> call insertEngineer('dinusha,nuwan,nirosh');
Query OK, 1 row affected (0.12 sec)

mysql> select * from engineer;
+----+----------+
| ID | NAME     |
+----+----------+
|  1 | dinusha  |
|  2 | nuwan    |
|  3 | nirosh   |
+----+----------+

次に、上記の結果を使用してサンプルテーブルを結合します。GL

于 2013-03-02T01:35:28.030 に答える
2

また、テーブルソースとして値を使用できます

SELECT Row, Code, Value
FROM [Sample] s JOIN (       
                      SELECT ROW_NUMBER() OVER(ORDER BY(SELECT 1)) AS Row, Match
                      FROM (VALUES ('Beta'), 
                                   ('Echo'), 
                                   ('Alpha'))
                      x (Match)                             
                      ) o ON s.Code = o.Match
ORDER BY Row   

SQLFiddleのデモ

于 2013-03-02T12:06:55.920 に答える
0

行番号も含めるために、上記で行ったことに少し変更を加えただけです。

SELECT  CASE   
          WHEN Code = 'BetaBeta' THEN 1  
          WHEN Code = 'Beta' THEN 2  
          WHEN Code = 'Alpha' THEN 3  
        END CodeOrder,  
        *  
FROM Sample  
WHERE Code in ('BetaBeta','Beta','Alpha')  
ORDER BY CodeOrder  

SQL フィドルのデモ

于 2013-03-02T05:43:06.730 に答える
0

文字列関数を使用してこれを実行したくなるかもしれません。

declare @list varchar(8000) = 'Beta,Echo,Alpha';

with Sample as (
    select 'Alpha' as Code, 'Pig' as Value union all
    select 'Beta', 'Horse' union all
    select 'Charlie', 'Dog' union all
    select 'Delta', 'Cat' union all
    select 'Echo', 'Fish'
)
select * from Sample
where charindex(Code, @list) > 0
order by charindex(Code, @list)

サブマッチが心配な場合は、「区切り文字」のトリックを実行してください。

where @list like '%,'+Code+',%' 
于 2013-03-02T01:22:27.543 に答える