使用if条件where子句的M​​ySQL查询

时间:2019-02-21 02:35:50

标签: java mysql sql database where-clause

我有ID,appId,status,orderId的表ORDERS。

  

状态可以-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 :(得分:0)

下面将是通用查询-

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

如果您可以提供表和列的详细信息,则也可以通过join来完成。

希望这会有所帮助。

答案 1 :(得分:0)

您可以合并查询。这将为您提供所需的数据。

(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)
  )

希望这会有所帮助

答案 2 :(得分:-1)

提供的答案都不是最佳的,因为它们都使用UNION。完全没有理由这样做,您可以使用AND,OR和括号将WHERE子句中的子句组合在一起,从而轻松添加所需的多个子句。

我也考虑使用and exists(subquery)而不是使用in (subquery)