SQL - 基于查询参数保留排序

时间:2011-05-04 16:09:07

标签: sql oracle

我正在尝试使用SELECT子句执行IN,我希望能够以与{{1}列表中的元素相同的顺序返回结果}}。例如:

IN

我希望他们以同样的顺序回来。理想情况下,如果我能得到如下声明,那就太好了。

SELECT * FROM orders WHERE order_no IN ('B123', 'B483', 'B100', 'B932', ...);

我已经看到了使用CASEDECODE关键字来定义某种自定义排序的查询示例。但是,在所有这些例子中,他们的排序是针对一组预定的选项。然而,我的订购完全取决于我的用户输入的搜索条件,因此可能有2个选项列表或100个订单列表...

有什么想法吗?我不知道某些Oracle功能,或某种方式使用SELECT * FROM orders WHERE order_no IN ('B123', 'B483', 'B100', 'B932', ...) ORDER BY ('B123', 'B483', 'B100', 'B932', ...); CASE作为动态集?

7 个答案:

答案 0 :(得分:4)

将值插入临时表并将您的选择加入到该表中。

然后,您可以在临时表列上执行自然顺序。

CREATE GLOBAL TEMPORARY TABLE sort_table (
  value       VARCHAR2(100),
  sort_order  NUMBER
) ON COMMIT DELETE ROWS;

INSERT INTO sort_table VALUES ('B123',1);
INSERT INTO sort_table VALUES ('B483',2);
... etc. ...

select * from mytable
inner join sort_table
on mytable.mycolumn = sort_table.value
order by sort_table.sort_order;

要清除临时表,只需COMMIT

答案 1 :(得分:2)

我不知道是否有一个优雅(或简短)的解决方案。

如果您可以动态构建查询,则以下内容应该有效:

WITH numbers AS (
   SELECT 1 as sort_order, 'B123' as order_no FROM DUAL
   union all
   SELECT 2 as sort_order, 'B483' as order_no FROM DUAL
   union all
   SELECT 2 as sort_order, 'B100' as order_no FROM DUAL
   union all
   SELECT 2 as sort_order, 'B932' as order_no FROM DUAL
)
SELECT orders.*
FROM numbers  
  LEFT JOIN orders ON orders.ord_no = numbers.ord_no
ORDER BY numbers.sort_order

答案 2 :(得分:2)

你可以试试它会工作正常。检查下面的sql: -

SELECT * FROM orders WHERE order_no IN ('B123', 'B483', 'B100', 'B932') 
ORDER BY DECODE(order_no,'B123','1','B483','2','B100','3','B932','4');

答案 3 :(得分:1)

您可以通过instr连接变量和顺序,如下所示。我不能保证这个效率 - 但必须是Okey.Your前端显然需要做更多的工作。但是构建这样的查询可以打开sql Injection。

SELECT * FROM orders WHERE order_no IN ('B123', 'B483', 'B100', 'B932', ...)
ORDER BY 
  instr ('@B123@'|| '@B483@'||'@B100@'||'@B932@'||... ,'@'|| order_no||'@')

答案 4 :(得分:1)

如果您想使用DECODE分配数字排序顺序:

SELECT ID FROM tbl WHERE ID IN (2,3,1)
ORDER BY DECODE(ID, 2, 1, 3, 2, 3)

答案 5 :(得分:0)

我在最近的一个问题中给出了答案

https://stackoverflow.com/questions/14234748/preserve-rows-order-in-select-query-as-same-in-statement

我的回答是使用管道行功能,所以它不需要像这里接受的答案那样使用临时表。

答案 6 :(得分:-1)

我不是一个Python人,但这是我在PHP中的表现,我希望你能理解。

  1. 构建一个这样的字符串:

    $ str =“('B123','B483','B100','B932',...)”;

    对于上述内容,您可以使用for循环或其他东西来构建一个非常长的字符串。

  2. 在查询中插入字符串,如下所示:

  3. $MyQuery = "SELECT * FROM orders WHERE order_no IN $str
    ORDER BY $str";
    

    就像我说的,这是一个PHP示例,但我相信你明白了。