-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 行一起出现。

我怎样才能做到这一点?

4

3 回答 3

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在这里

更新您的新数据/问题

(注意 - 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;

更新了 SqlFiddle

于 2013-06-13T07:07:59.277 回答
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
于 2013-06-13T07:05:54.753 回答
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

第二种选择

如果不能插入列,可以使用 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 子句会将您的结果按所需顺序分组。

第一个选项比任何一天都好。

于 2013-06-13T07:06:08.330 回答