IN句の順序でレコードを選択します

sql tsql
IN句の順序でレコードを選択します

私は持っています

SELECT * FROM Table1 WHERE Col1 IN(4,2,6)

IN句で指定した順序でレコードを選択して返します(Col1 = 4、Col1 = 2の最初の表示レコード
…​)

私は使えます

SELECT * FROM Table1 WHERE Col1 = 4
UNION ALL
SELECT * FROM Table1 WHERE Col1 = 6 , .....

しかし、私はそれを使用したくありません。自動生成ではなく、ストアドプロシージャとして使用したいのです。

  3  1


ベストアンサー

もう少し遅れますが、最善の方法は

SELECT *
FROM   Table1
WHERE  Col1 IN( 4, 2, 6 )
ORDER  BY CHARINDEX(CAST(Col1 AS VARCHAR), '4,2,67')

Or

SELECT CHARINDEX(CAST(Col1 AS VARCHAR), '4,2,67')s_order,
       *
FROM   Table1
WHERE  Col1 IN( 4, 2, 6 )
ORDER  BY s_order

16


いくつかの選択肢があります。 最も単純な方法は、INパラメーター(それらはパラメーターです)を、受け取った順に別のテーブルに入れ、そのテーブルでORDER BYすることです。

6


解決策は次のとおりです。

SELECT * FROM Table1
WHERE Col1 IN(4,2,6)
ORDER BY
    CASE Col1
    WHEN 4 THEN 1
    WHEN 2 THEN 2
    WHEN 6 THEN 3
    END

3


select top 0 0 'in', 0 'order' into #i
insert into #i values(4,1)
insert into #i values(2,2)
insert into #i values(6,3)

select t.* from Table1 t inner join #i i on t.[in]=t.[col1] order by i.[order]

1


`IN`の値を、クエリで使用されるソート順の列を含むテーブルに置き換えます(そして、ソート順を呼び出しアプリケーションに公開するようにしてください):

WITH OtherTable (Col1, sort_seq)
     AS
     (
      SELECT Col1, sort_seq
        FROM (
              VALUES (4, 1),
                     (2, 2),
                     (6, 3)
             ) AS OtherTable (Col1, sort_seq)
     )
SELECT T1.Col1, O1.sort_seq
  FROM Table1 AS T1
       INNER JOIN OtherTable AS O1
          ON T1.Col1 = O1.Col1
 ORDER
    BY sort_seq;

CTEではなくストアドプロシージャで、値をテーブル(スクラッチベーステーブル、一時テーブル、テーブルを返す関数など)に分割し、必要に応じて並べ替え列を設定します。

1


別の解決策を見つけました。 それは、いつかからの答えに似ていますが、少し短くなっています。

SELECT sort.n, Table1.Col1
FROM (VALUES (4), (2), (6)) AS sort(n)
JOIN Table1
ON Table1.Col1 = sort.n

1


これがプログラミングの問題なのかデータアーキテクチャの問題なのか判断できないため、この問題について2つの異なる方法を考えています。 「有名な」テレビ動物を組み込んだ以下のコードをご覧ください。 イルカ、ウマ、クマ、イヌ、オランウータンを追跡しているとしましょう。 クエリ内の馬、クマ、犬のみを返し、クマは馬よりも先にソートして犬よりも先にソートするようにします。 私はこれをアーキテクチャの問題と見なすことを個人的に好みますが、プログラミングの問題と見なすことはできません。 質問があれば教えてください。

CREATE TABLE #AnimalType (
  AnimalTypeId      INT         NOT NULL PRIMARY KEY
  , AnimalType      VARCHAR(50) NOT NULL
  , SortOrder       INT         NOT NULL)

INSERT INTO #AnimalType VALUES (1,'Dolphin',5)
INSERT INTO #AnimalType VALUES (2,'Horse',2)
INSERT INTO #AnimalType VALUES (3,'Bear',1)
INSERT INTO #AnimalType VALUES (4,'Dog',4)
INSERT INTO #AnimalType VALUES (5,'Orangutan',3)

CREATE TABLE #Actor (
  ActorId           INT         NOT NULL PRIMARY KEY
  , ActorName       VARCHAR(50) NOT NULL
  , AnimalTypeId    INT         NOT NULL)

INSERT INTO #Actor VALUES (1,'Benji',4)
INSERT INTO #Actor VALUES (2,'Lassie',4)
INSERT INTO #Actor VALUES (3,'Rin Tin Tin',4)
INSERT INTO #Actor VALUES (4,'Gentle Ben',3)
INSERT INTO #Actor VALUES (5,'Trigger',2)
INSERT INTO #Actor VALUES (6,'Flipper',1)
INSERT INTO #Actor VALUES (7,'CJ',5)
INSERT INTO #Actor VALUES (8,'Mr. Ed',2)
INSERT INTO #Actor VALUES (9,'Tiger',4)



/* If you believe this is a programming problem then this code works */
SELECT  *
FROM    #Actor a
WHERE   a.AnimalTypeId IN (2,3,4)
ORDER   BY case when a.AnimalTypeId = 3 then 1
                when a.AnimalTypeId = 2 then 2
                when a.AnimalTypeId = 4 then 3 end

/* If you believe that this is a data architecture problem then this code works */
SELECT  *
FROM    #Actor a
JOIN    #AnimalType at ON a.AnimalTypeId = at.AnimalTypeId
WHERE   a.AnimalTypeId IN (2,3,4)
ORDER   BY at.SortOrder


DROP TABLE #Actor
DROP TABLE #AnimalType

0


タイトルとURLをコピーしました