我希望查询结果集中的行遵循我在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行一起使用。
我怎样才能做到这一点?
答案 0 :(得分: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标签仅在稍后添加。)
您可以使用temp table
@ pdleorme的创意来创建'订单'表。由于您需要动态,因此请按照您希望结果排序的顺序插入过滤器值,如下所示。请注意,不再需要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;
答案 1 :(得分: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
答案 2 :(得分:0)
您尚未提供查询。尽管如此,假设您不能使用您提到的Order By子句,有两种方法可以实现此目的:
第一个选项
在名为" 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
第二个选项
如果无法插入Column,则可以使用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子句将按所需顺序对结果进行分组。
第一种选择是任何一天更好。