在where子句中编写SQL case语句

时间:2012-08-21 16:15:49

标签: sql case

我有两个表,我已经在其中执行了内连接。我有一个场景,我需要根据这两个条件从第一个表中获取值。

我的查询是

SELECT rm.ROUTE_ID
            , rm.ROUTE_CODE
            , rm.START_PLACE_ID
            , rm.END_PLACE_ID
            , rm.IS_ACTIVE
            , rm.LINKED_ROUTE
        FROM OPRS_ROUTE_MASTER rm
        INNER JOIN OPRS_ROUTE_HALTS rh
            ON rh.ROUTE_ID = rm.ROUTE_ID
        WHERE rh.PLACE_ID  = '51'

现在我需要在where子句中再有两个条件。

case 1: when rm.START_PLACE_ID > 0 then i need to append AND rm.START_PLACE_ID to where clause

case 2: when rm.END_PLACE_ID > 0 then i need to append AND rm.START_PLACE_ID to where clause

如果两者都大于零,那么我需要将两个案例都附加到where子句。

有人可以帮助我

3 个答案:

答案 0 :(得分:0)

除非我遗漏了您的要求,否则您只需使用WHEREOR

添加其他AND过滤条件即可
SELECT rm.ROUTE_ID
    , rm.ROUTE_CODE
    , rm.START_PLACE_ID
    , rm.END_PLACE_ID
    , rm.IS_ACTIVE
    , rm.LINKED_ROUTE
FROM OPRS_ROUTE_MASTER rm
INNER JOIN OPRS_ROUTE_HALTS rh
    ON rh.ROUTE_ID = rm.ROUTE_ID
WHERE rh.PLACE_ID  = '51'
OR (or AND)
(
    (rm.START_PLACE_ID > 0 OR rm.END_PLACE_ID > 0)
    AND rm.START_PLACE_ID = yourValue
)

答案 1 :(得分:0)

或许这样的事情?

SELECT rm.route_id, 
       rm.route_code, 
       rm.start_place_id, 
       rm.end_place_id, 
       rm.is_active, 
       rm.linked_route 
FROM   oprs_route_master rm 
       INNER JOIN oprs_route_halts rh 
               ON rh.route_id = rm.route_id 
WHERE  rh.place_id = '51' 
       AND ( rm.start_place_id <= 0 
              OR RM.start_place_id = xxx ) 
       AND ( rm.end_place_id <= 0 
              OR RM.start_place_id = yyy ) 

希望有所帮助。

答案 2 :(得分:0)

我将查询设置为:

select rm.ROUTE_ID       ,
       rm.ROUTE_CODE     ,
       rm.START_PLACE_ID ,
       rm.END_PLACE_ID   ,
       rm.IS_ACTIVE      ,
       rm.LINKED_ROUTE
from OPRS_ROUTE_MASTER rm
join OPRS_ROUTE_HALTS  rh on rh.ROUTE_ID = rm.ROUTE_ID
                         and rh.PLACE_ID = '51'
where rm.START_PLACE_ID = case when rm.START_PLACE_ID > 0 then @myStartPlaceID else rm.START_PLACE_ID end
  and rm.END_PLACE_ID   = case when rm.END_PLACE_ID   > 0 then @myEndPlaceID   else rm.END_PLACE_ID   end

如果表格行在所需列(START_PLACE_IDEND_PLACE_ID)中具有正值,则会将该列与所需值进行比较,否则将其与自身进行比较。

这避免了使用交替(OR运算符):使用OR会降低执行计划,强制执行表或索引扫描而不是搜索。