我正在尝试使用SELECT
子句执行IN
,我希望能够以与{{1}列表中的元素相同的顺序返回结果}}。例如:
IN
我希望他们以同样的顺序回来。理想情况下,如果我能得到如下声明,那就太好了。
SELECT * FROM orders WHERE order_no IN ('B123', 'B483', 'B100', 'B932', ...);
我已经看到了使用CASE
或DECODE
关键字来定义某种自定义排序的查询示例。但是,在所有这些例子中,他们的排序是针对一组预定的选项。然而,我的订购完全取决于我的用户输入的搜索条件,因此可能有2个选项列表或100个订单列表...
有什么想法吗?我不知道某些Oracle功能,或某种方式使用SELECT * FROM orders WHERE order_no IN ('B123', 'B483', 'B100', 'B932', ...)
ORDER BY ('B123', 'B483', 'B100', 'B932', ...);
或CASE
作为动态集?
答案 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)
我在最近的一个问题中给出了答案
我的回答是使用管道行功能,所以它不需要像这里接受的答案那样使用临时表。
答案 6 :(得分:-1)
我不是一个Python人,但这是我在PHP中的表现,我希望你能理解。
构建一个这样的字符串:
$ str =“('B123','B483','B100','B932',...)”;
对于上述内容,您可以使用for循环或其他东西来构建一个非常长的字符串。
在查询中插入字符串,如下所示:
$MyQuery = "SELECT * FROM orders WHERE order_no IN $str ORDER BY $str";
就像我说的,这是一个PHP示例,但我相信你明白了。