показать и отметить некоторые записи сверху - PullRequest
0 голосов
/ 31 августа 2010

Моя целевая СУБД - 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

Можно ли дать кросс-СУБД эквивалент этого запроса?

UPDATE

Хорошо, это разрушает логику, парень до меня хотел всегда показывать некоторых пользователей сверху,

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 ]

1 голос
/ 31 августа 2010

Вы должны поместить 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 (?,?,?)
1 голос
/ 31 августа 2010

Это должно работать:

WHERE users.id IN (?) AND 
  -- some filters
0 голосов
/ 31 августа 2010

Если вам нужны эти строки сверху, а не только эти строки, вам просто нужно поместить их в ORDER BY, а не в WHERE (или в SELECT).

Не знаю, сработает ли это на MySQL, но для Oracle

ORDER BY
    CASE WHEN users.id IN (?) then 1 else 2 end, users.label
0 голосов
/ 31 августа 2010

Мне кажется, этот запрос не будет работать и для MySQL.Вы можете использовать «IN» только в части «WHERE» запроса.В вашем примере это в списке полей.Можете ли вы предоставить полный запрос без ваших комментариев внутри него?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...