代码之家  ›  专栏  ›  技术社区  ›  Samra

等级对联合

  •  1
  • Samra  · 技术社区  · 6 年前

    嗨,我需要根据where子句中满足的条件对行进行排序。所以我写了这个问题

    select 1 as priority, usr_fname, usr_lname from core_users where usr_fname = 'John' and usr_lname = 'smith' and suburb = '0162'
    union
    select 2 as priority, usr_fname, usr_lname from core_users where usr_fname = 'John' and usr_lname = 'smith' and usr_title = 'Mr' 
    union
    select 3 as priority, usr_fname, usr_lname from core_users where usr_fname = 'John' and usr_lname = 'smith'
    

    现在我的tl坚持我可以在这里使用sql rank()/row_number()。有人能指导怎么做吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Gordon Linoff    6 年前

    如果你真的用 row_number() ,可以获得3个以上的值:

    select usr_fname, usr_lname,
           row_number() over (case when suburb = '0162' then 1
                                   when usr_title = 'Mr' then 2
                                   else 3
                              end) as priority
    from core_users
    where usr_fname = 'John' and usr_lname = 'smith' ;
    

    您可以通过使用 dense_rank() 而不是 行数() 是的。但是,如果数据中不表示这三个组,则数字将为“1”或“1”和“2”。

    然而,更简单的版本只使用 case 表达和做你想做的事:

    select usr_fname, usr_lname,
           (case when suburb = '0162' then 1
                 when usr_title = 'Mr' then 2
                 else 3
            end) as priority
    from core_users
    where usr_fname = 'John' and usr_lname = 'smith' ;
    

    您的版本会多次返回同一行——每匹配一个优先级返回一次。这只返回每一行一次,我猜这是您的实际意图。