在顶部显示并标记一些记录

时间:2010-08-31 05:20:49

标签: mysql oracle

我的目标DBMS是Oracle和MySQL

 SELECT
  users.*
  , hr_orders.position_label
  , hr_orders.is_boss
  , deps.label AS dep_label        -- preprocessor removes AS when using Oracle
  , users.id IN (?) AS show_on_top -- Oracle doesn't accept this IN thing
 FROM
  -- some joins here
 WHERE
  -- some filters

是否可以提供与此查询等效的跨DBMS?

更新

好吧,它破坏了逻辑,我面前的那个人总是希望显示一些用户,

WHERE
    users.fake = 0
AND (
        users.id IN (?)
    OR
        -- some more detailed filters
    )
ORDER BY
    IF (users.id IN (?), 1, 2), users.label

在哪里?是指顶级用户的参数。

此show_on_top字段需要稍后突出显示最佳记录。

因此,如果我将IN移至where子句,则只会选择显示在顶部的用户,而不是其他用户。

将查询拆分为两个并在代码中组合用户列表仍然看起来很难看。

4 个答案:

答案 0 :(得分:1)

这应该有效:

WHERE users.id IN (?) AND 
  -- some filters

答案 1 :(得分:1)

您应该将IN放入WHERE子句

SELECT
  users.*
  , hr_orders.position_label
  , hr_orders.is_boss
  , deps.label AS dep_label        
  , users.id  AS show_on_top 
 FROM
  -- some joins here
 WHERE
  -- some filters
  AND users.id IN (?,?,?)

答案 2 :(得分:0)

在我看来,这个查询也不适用于mysql。您只能在查询的“WHERE”部分使用“IN”。在您的示例中,它位于字段列表中。你能在没有评论的情况下提供完整的查询吗?

答案 3 :(得分:0)

如果您希望这些行位于顶部,而不仅仅是这些行,您只需将它们放在ORDER BY中,而不是放在WHERE中(或在SELECT中)。

不知道这是否适用于MySQL,但它应该适用于Oracle

ORDER BY
    CASE WHEN users.id IN (?) then 1 else 2 end, users.label