Ordering by the order of values in a SQL IN() clause

前端 未结 13 807
旧巷少年郎
旧巷少年郎 2020-11-22 04:12

I am wondering if there is away (possibly a better way) to order by the order of the values in an IN() clause.

The problem is that I have 2 queries, one that gets al

相关标签:
13条回答
  • 2020-11-22 04:35

    I just tried to do this is MS SQL Server where we do not have FIELD():

    SELECT table1.id
    ... 
    INNER JOIN
        (VALUES (10,1),(3,2),(4,3),(5,4),(7,5),(8,6),(9,7),(2,8),(6,9),(5,10)
        ) AS X(id,sortorder)
            ON X.id = table1.id
        ORDER BY X.sortorder
    

    Note that I am allowing duplication too.

    0 讨论(0)
  • 2020-11-22 04:35

    Give this a shot:

    SELECT name, description, ...
    WHERE id IN
        (SELECT id FROM table1 WHERE...)
    ORDER BY
        (SELECT display_order FROM table1 WHERE...),
        (SELECT name FROM table1 WHERE...)
    

    The WHEREs will probably take a little tweaking to get the correlated subqueries working properly, but the basic principle should be sound.

    0 讨论(0)
  • 2020-11-22 04:36

    The IN clause describes a set of values, and sets do not have order.

    Your solution with a join and then ordering on the display_order column is the most nearly correct solution; anything else is probably a DBMS-specific hack (or is doing some stuff with the OLAP functions in standard SQL). Certainly, the join is the most nearly portable solution (though generating the data with the display_order values may be problematic). Note that you may need to select the ordering columns; that used to be a requirement in standard SQL, though I believe it was relaxed as a rule a while ago (maybe as long ago as SQL-92).

    0 讨论(0)
  • 2020-11-22 04:38

    See following how to get sorted data.

    SELECT ...
      FROM ...
     WHERE zip IN (91709,92886,92807,...,91356)
       AND user.status=1
    ORDER 
        BY provider.package_id DESC 
         , FIELD(zip,91709,92886,92807,...,91356)
    LIMIT 10
    
    0 讨论(0)
  • 2020-11-22 04:40
    SELECT ORDER_NO, DELIVERY_ADDRESS 
    from IFSAPP.PURCHASE_ORDER_TAB 
    where ORDER_NO in ('52000077','52000079','52000167','52000297','52000204','52000409','52000126') 
    ORDER BY instr('52000077,52000079,52000167,52000297,52000204,52000409,52000126',ORDER_NO)
    

    worked really great

    0 讨论(0)
  • 2020-11-22 04:41

    Two solutions that spring to mind:

    1. order by case id when 123 then 1 when 456 then 2 else null end asc

    2. order by instr(','||id||',',',123,456,') asc

    (instr() is from Oracle; maybe you have locate() or charindex() or something like that)

    0 讨论(0)
提交回复
热议问题