2013-06-13 39 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