2014-09-15 4 views
1

은 내가정렬 결과는

id name 
2 B 
1 A 
4 D 
3 C 

을 좀하고 싶습니다

SELECT id,name FROM table WHERE id IN (2,1,4,3) 

같이 보입니다 쿼리를하고 있어요하지만 난

납니다 매개 변수 목록처럼
1 A 
2 B 
3 C 
4 D 

내가 IN 이후에 포함하는 목록과 동일한 방식으로 쿼리 결과를 정렬 할 수있는 방법이 있습니까?

내가 그것을 필요 실용적인 이유가, 날 믿어)

+0

어떤 종류의 데이터베이스를 사용하고 있습니까? MySQL, oracle, MSSQL 또는 기타? –

답변

0
SELECT id,name FROM table WHERE id IN (2,1,4,3) 
ORDER BY CASE id 
    WHEN 2 THEN 1 
    WHEN 1 THEN 2 
    WHEN 4 THEN 3 
    WHEN 3 THEN 4 
    ELSE 5 
END 

이이 문제를 해결할 수 있습니다.


해결 방법 2는 임시 테이블에 목록을 삽입하고 그들에게

id, seq(+1 every new row added) 
----------------- 
2 1 
1 2 
4 3 
3 4 

다음이 서열에 의해 2 테이블 함께 주문 조인 실행 순서를 얻을.

+0

IN 매개 변수의 상수 목록이 없습니다. 내 응용 프로그램의 다른 부분에서 생성되며 1000 개의 숫자로 구성 될 수 있습니다. 제 생각에는이 솔루션을 사용할 수 없습니다. – RRM

+0

그런 다음 코딩 측면에서 SQL 대신 –

+0

http://stackoverflow.com/questions/1244028/sql-order-by-list-of-strings 대신 목록을 얻으려고 시도 할 수 있습니다. 여기에 1.order FIELD (귀하의 목록), 2.order by find_in_set (id, 'your list') –

0

오케이, 내가 직접 해냈습니다. 조금 화가 나지만 작동합니다.)

DECLARE @IDs varchar(max) 
DECLARE @nr int 
DECLARE @znak varchar(1) 
DECLARE @index int 
DECLARE @ID varchar(max) 

SET @IDs='7002,7001,7004,7003' 
SET @nr=1 
SET @index=1 

IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp 
CREATE TABLE #temp (nr int, id int) 

--fill temp table with Ids 
WHILE @index<=LEN(@Ids) 
BEGIN 
set @znak='' 
set @ID='' 

WHILE @znak<>',' AND @index<=LEN(@Ids) 
BEGIN 
    SET @znak= SUBSTRING(@IDs,@index,1) 
    IF @znak<>',' SET @[email protected][email protected] 
    SET @[email protected]+1 
END 
INSERT INTO #temp(nr,id) VALUES (@nr,CAST(@ID as int)) 
SET @[email protected]+1 
END 

-- select proper data in wanted order 
SELECT MyTable.* FROM MyTable 
INNER JOIN #temp ON MyTable.id=#temp.id 
ORDER BY #temp.nr