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'

现在我需要在 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 子句。

有人可以帮帮我吗

4

3 回答 3

0

除非我在您的要求中遗漏了某些内容,否则您可以WHERE使用OR或添加另一个过滤器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
)
于 2012-08-21T16:20:00.463 回答
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 ) 

希望有帮助。

于 2012-08-21T16:22:37.060 回答
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可以降低执行计划,强制执行表或索引扫描而不是查找。

于 2012-08-21T18:03:18.483 回答