Мои целевые СУБД - это 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, будут выбраны только пользователи, показанные сверху, а не остальные.
Разделение запроса на два и объединение списка пользователей в коде по-прежнему выглядит уродливо для меня.
Вы должны поместить 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 (?,?,?)
Это должно работать:
WHERE users.id IN (?) AND
-- some filters
Если вы хотите, чтобы эти строки сверху, а не только эти строки, вам просто нужно поместить их в ORDER BY, а не в WHERE (или в SELECT).
Не знаю, будет ли это работать на MySQL, но это необходимо для Oracle
ORDER BY
CASE WHEN users.id IN (?) then 1 else 2 end, users.label
Мне кажется, что этот запрос не будет работать и для mysql. Вы можете использовать "IN" только в части запроса "WHERE". В вашем примере это находится в списке полей. Можете ли вы предоставить полный запрос без комментариев внутри него?
SELECT SQL_CALC_FOUND_ROWS users.*, users.id IN (-1,547,547,547,547) AS show_on_top
547 SELECT SQL_CALC_FOUND_ROWS users.*, users.id IN (-1,547,547,547,547) AS show_on_top
в журнале MySQl, и ошибки нет. Очевидно, это сработало, и я бы переписал весь запрос