MySQL запрос с условием if условие where - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть таблица ORDERS с id, appId, status, orderId.

статус может - OK, ONHOLD, DONE, REJECT и т. Д.

For this use case i want to filter with 
    status OK and ONHOLD
    and order
      if status is "OK" - I want to get allow all orderIds
      if status is "ONHOLD" - only get ids with whiteList orders.
Here the statusList has 2 Strings and whiteListOrders dynamically generated list
 public List<Long> getIds(
   @Bind("appId") String appId,
   @BindIn("statusList") List<String> statusList,
   @BindIn("whiteListOrders") List<String> whiteListOrders);

Как этого добиться в запросе mysql

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Вы можете объединить запросы.Это даст вам необходимые данные.

(SELECT ids FROM ORDERS WHERE status='OK' AND ids IN (@whiteListIds))
UNION  
(SELECT ids FROM ORDERS WHERE status='ONHOLD' AND ids IN (@whiteListIds))

Как уже упоминалось, это было бы возможно без UNION:

#set @whitelist = your whitelist IDS; /* Not sure how you have this setup */
SELECT 
  * 
FROM 
  user 
WHERE 
  status='OK' 
  OR (
    status='ONHOLD' 
    AND id IN (@whitelist)
  )

Надеюсь, это поможет,

0 голосов
/ 21 февраля 2019

Ни один из предоставленных ответов не является оптимальным, поскольку они оба используют UNION.Нет никаких причин делать это, вы можете легко добавить любые нужные вам несколько предложений, комбинируя предложения внутри предложения WHERE, используя комбинацию AND, OR и круглых скобок.

Я бы также рассмотрел использование and exists(subquery)вместо использования in (subquery)

0 голосов
/ 21 февраля 2019

Ниже приведен общий запрос -

SELECT <req cols> 
FROM   mytable1 
WHERE  status='OK' 
UNION 
SELECT <req cols> 
FROM   mytable 
WHERE  status='ONHOLD' 
AND    id IN 
       ( 
              SELECT orderids 
              FROM   <whitelistorders>)

Если вы можете предоставить сведения о таблице и столбце, вы можете сделать это и с помощью объединения.

Надеюсь, это поможет.

...