3

こんにちは、IN 演算子を使用して単純なクエリを使用しています。次のクエリを使用しています

SELECT CustID  FROM Customer WHERE CustID in (6,34,5,4,3,2,1)

次の注文が表示されるようになりました

custId  
1   
2   
3   
4   
5   
6   
34

INしかし、句で渡すのと同じシーケンスとして結果が必要です。

4

6 に答える 6

3
SELECT CustID  FROM Customer WHERE CustID in (6,34,5,4,3,2,1)
ORDER BY  CASE WHEN CustId = 34
               THEN 5.5
               ELSE CustId
          END DESC
于 2013-04-15T06:12:23.567 に答える
2

このクエリ Ramdas を試してください......

SELECT CustID  FROM Customer WHERE CustID in (6,34,5,4,3,2,1) 
ORDER BY CHARINDEX(','+CAST(CustID as varchar(MAX))+',', ',6,34,5,4,3,2,1,')
于 2013-04-16T04:02:43.883 に答える
0

これを試してみてください -

DECLARE @id TABLE
(
      i INT IDENTITY(1,1)
    , id INT
)

INSERT INTO @id (id)
VALUES (6),(34),(5),(4),(3),(2),(1)

SELECT c.CustID  
FROM dbo.Customer c
JOIN @id i ON i.id = c.CustID
ORDER BY i.i
于 2013-04-15T06:13:54.333 に答える
0

順序付けされた値で分割文字列 CTE を使用します。したがって、任意のデータセットを並べ替えることができます

DECLARE @test nvarchar(100) = '6,34,5,4,3,2,1';
;WITH cte AS
 (
  SELECT SUBSTRING(@test , 0, CHARINDEX( ',', @test)) AS val ,
         CAST(STUFF (@test + ',' , 1, CHARINDEX( ',', @test), '') AS nvarchar(100 )) AS stval,
         1 AS [level]
  UNION ALL
  SELECT SUBSTRING(stval , 0, CHARINDEX( ',', stval)),
         CAST(STUFF (stval, 1, CHARINDEX(',' , stval ), '' ) AS nvarchar(100 )),
         [level] + 1
  FROM cte
  WHERE stval != ''
  )
  SELECT c2.CustID
  FROM dbo.Customer c2 JOIN cte c ON c2.CustID = c.val
  ORDER BY c.[level]

SQLFiddle のデモ

また、CTEを関数でラップすることもできます

CREATE FUNCTION dbo. SplitStrings_CTE(@List nvarchar( 1000), @Delimiter nvarchar(1 ))
RETURNS TABLE
AS
RETURN
WITH cte AS
 (
  SELECT SUBSTRING(@List , 0 , CHARINDEX (@Delimiter, @List)) AS val ,
         CAST(STUFF (@List + @Delimiter, 1 , CHARINDEX (@Delimiter, @List), '') AS nvarchar (1000)) AS stval, 1 AS [level]
  UNION ALL
  SELECT SUBSTRING(stval , 0 , CHARINDEX (@Delimiter, stval)),
         CAST(STUFF (stval , 1, CHARINDEX( @Delimiter , stval ), '' ) AS nvarchar(1000 )), [level] + 1
  FROM cte
  WHERE stval != ''
  )
  SELECT REPLACE(val , ' ' , '' ) AS val, [level]
  FROM cte

関数を使用した SELECT ステートメント

DECLARE @test nvarchar(100) = '6,34,5,4,3,2,1';
SELECT CustID
FROM dbo.Customer c2 JOIN (SELECT val, [level] FROM dbo.SplitStrings_CTE(@test, ',')
                           ) c ON c2.CustID = c.val
ORDER BY c.[level]

また

DECLARE @test nvarchar(100) = '6,34,5,4,3,2,1';
SELECT CustID
FROM dbo.Customer c2 CROSS APPLY dbo.SplitStrings_CTE(@test, ',') c                           
WHERE c2.CustID = c.val
ORDER BY c.[level]
于 2013-04-15T09:31:03.237 に答える
0

select標準 SQL では、ステートメントまたはin句でデフォルトの順序を指定しません。行は、DBMS が希望する順序で返されます。

順序を特定のものに強制したい場合は、order-by 句を使用する必要があります。

一部の SQL実装ではこれを構成できる場合がありますが、私が定期的に使用する SQL 実装では構成できません。最悪の場合、次のようなことを試すことができます。

select 1 as x, custid from customer where custid = 6
union all select 2 as x, custid from customer where custid = 34
union all select 3 as x, custid from customer where custid = 5
order by x

しかし、それはかなり醜く、過度に効率的ではありません。

于 2013-04-15T06:08:11.910 に答える
0

できません。それを実現したい場合は、結果を注文できる「showorder」などの新しいフィールドが必要になります。

SELECT CustID FROM Customer WHERE CustID IN (6,34,5,4,3,2,1) ORDER BY showorder
于 2013-04-15T06:08:32.987 に答える