2013-06-13 43 views
-2

我希望查詢的結果集中的行遵循我在IN子句中指定的值的特定順序。輸出中的自定義行順序

這是我的查詢:

SELECT rd.id, 
     rd.room_no, 
     rd.bed_one, 
     rd.bed_two, 
     rd.bed_count, 
     ir.room_type_id, 
     ir.prop_id 
FROM room_details rd 
    JOIN (inventory_rooms ir) 
WHERE ir.id=rd.inventory_type_id 
    AND ir.prop_id IN ('6966','9016','8900','15242'); 

這是結果集:

id room_no  bed_one bed_two bed_count room_type_id prop_id 
--- ---------- ------- ------- --------- ------------ ------- 
48 C- 202-01A null  null  1   20   6966 
49 C- 202-02A null  null  1   20   6966 
24 D-802 -A null  null  1   20   9016 
25 D-802 -B null  null  1   20   9016 
243 101   null  null  1   4    8900 
267 102-B  null  null  1   4    8900 
23 D-804 -C C1  C2  2   21   9016 
39 D-805-A  A1  A2  2   21   9016 

我想同prop_id值粘在一起,並按照順序在IN列表。特別是,最後兩行應該與第3行和第4行一起出現。

我該如何做到這一點?

+3

在哪裏查詢? – Fabio

+0

您需要提供您正在使用的查詢。標記您正在使用的數據庫以提供輸入數據樣本以及所需結果也很有幫助。 –

+1

你如何決定訂單? – Bohemian

回答

1

您可以使用順序表:

order_table : 
id | order 
---------- 
1 | 1 
2 | 3 
3 | 2 
... 

select id 
    from data_table, 
     order_table 
where data_table.id = order_table.id 
order by order_table.order 
0

做一個加入/爲了您沒有提供查詢。不過,假設由你提到你不能使用ORDER BY子句,有2種方式,你可以做到這一點:

第一個選項

插入您的表中的另一列名爲「OrderByCol」

現在在你的數據,例如:

Sr OrderByCol Col3 
2 1   xyz 
2 1   abc 
3 3   123 
3 3   456 
4 2   qwerty 
4 2   123456 

然後用下面的查詢:

Select * from #table order by OrderByCol 

第二個選項

如果您不能插入列,你可以使用UNION ALL操作

Select * from #table1 where SrNo=2 
UNION all 
Select * from #table1 where SrNo=4 
UNION all 
Select * from #table1 where SrNo=3 

UNION ALL子句將組所需的順序結果。

第一個選擇是更好的一天。

2

因爲它似乎你需要SomeColumn一個相當任意的順序,你可以硬編碼的順序,像這樣:

SELECT id, someColumn 
    FROM `Table` 
    WHERE someColumn IN ('2','4','3') 
ORDER BY 
    CASE SomeColumn 
     WHEN '2' THEN 1 -- '2's come first 
     WHEN '4' THEN 2 -- then '4's 
     WHEN '3' THEN 3 -- then '3's 
     ELSE 4 -- then everything else, etc 
    END; 

SqlFiddle here

更新爲新的數據/問題

(注 - MSSQL - MySql標籤僅在以後添加。)

您可以在創建「訂單」表時使用@ pdleorme想法的temp table變體。由於您需要動態顯示,請按照您希望排序結果的順序插入篩選器值,如下所示。需要注意的是where條款就不再需要,因爲過濾將是隱含在加入到臨時表:

CREATE TABLE #tmpOrder 
(
    ID INT IDENTITY(1,1), -- used to retain the order 
    prop_id NVARCHAR(10) 
); 

-- Insert the filter columns values here, in the order in which you want to sort 
INSERT INTO #tmpOrder(prop_id) VALUES ('6966'), ('9016'), ('8900'), ('15242'); 

SELECT rd.id,rd.room_no,rd.bed_one,rd.bed_two, -- ... 
FROM room_details rd 
    JOIN inventory_rooms ir ON ir.id=rd.inventory_type_id 
    -- Where is No LONGER NEED WHERE ir.prop_id IN ('6966','9016', ... 
    JOIN #tmpOrder t on t.prop_id = ir.prop_id 
ORDER BY t.ID ASC; 

Updated SqlFiddle

+0

StuartLC謝謝,它的幫助,但問題是,如何使它動態意味着在子句參數計數並不總是3,我使用從那裏準備的聲明這些參數將被傳遞,所以在這scinatio我將如何案例?希望你有我的問題.. – Sthita

+0

@Sthita我已經更新了答案 - 使用具有明確順序的臨時表以相同的順序插入過濾器列,您希望結果進行排序。我使用了標識欄來保證訂單。 – StuartLC

+0

謝謝,我會嘗試 – Sthita