こんにちは、IN 演算子を使用して単純なクエリを使用しています。次のクエリを使用しています
SELECT CustID FROM Customer WHERE CustID in (6,34,5,4,3,2,1)
次の注文が表示されるようになりました
custId
1
2
3
4
5
6
34
IN
しかし、句で渡すのと同じシーケンスとして結果が必要です。
こんにちは、IN 演算子を使用して単純なクエリを使用しています。次のクエリを使用しています
SELECT CustID FROM Customer WHERE CustID in (6,34,5,4,3,2,1)
次の注文が表示されるようになりました
custId
1
2
3
4
5
6
34
IN
しかし、句で渡すのと同じシーケンスとして結果が必要です。
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
このクエリ 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,')
これを試してみてください -
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
順序付けされた値で分割文字列 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]
また、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]
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
しかし、それはかなり醜く、過度に効率的ではありません。
できません。それを実現したい場合は、結果を注文できる「showorder」などの新しいフィールドが必要になります。
SELECT CustID FROM Customer WHERE CustID IN (6,34,5,4,3,2,1) ORDER BY showorder