2012-04-27 62 views
2

我有2个表,一个包含开始和结束一个行程的位置产生的任何识别哪些行方式,而另一种含该行程期间每分钟车辆的纬度/经度位置。这些表格通过tripID相关联。通过该条件在where子句

像这样:

trip_table: 
TRIPID | DEP | ARR 
------------------ 
1  | CLE | CHI 
2  | CLE | ATL 
3  | ATL | CLE 

position_table: 
TRIPID | TIME    | LAT | LON 
----------------------------------------- 
2  | May-20-2012T00:23 | 35.4 | -84.2 
2  | May-20-2012T00:24 | 35.5 | -84.1 
3  | May-21-2012T11:14 | 42.0 | -112.4 

我有由2个条件的查询: 1.将其中跳闸离去所有位置数据/到达特定位置(一个或多个) 2.将所有的位置数据,其中行程通过一个特定的纬度/经度:

SELECT p.* FROM position AS p 
JOIN trip_table t ON (t.tripid = p.tripid) 
WHERE (t.dep = 'CLE' OR t.arr = 'CLE) 
OR (p.lat > 34 AND p.lat < 40 AND p.lon > -100 AND p.lon < -90) 

我的问题是:是否有可能修改此查询,以确定哪些结果行从第一个条件来(即行程飞离/到达在指定d位置)并且来自第二个(即,旅行通过了一个特定的经纬度)?

目前我唯一的想法就是跑2个独立的查询,但我想避免,如果有可能只是为了削减查询的总数。

如果有一个标准的SQL解决这类问题将是巨大的;如果不是,那么是否有PostgreSQL特定的解决方案也可以。

编辑:如果有人想知道为什么我想这样做 - 由此产生的位置被绘制在地图上,我想根据它们是来自有界区域还是来自两个到达/离开位置。

回答

3

你可以尝试这样的事情:

SELECT p.col1, p.col2, p.col3, 
    t.dep = 'CLE' OR t.arr = 'CLE' AS first_condition, 
    p.lat > 34 AND p.lat < 40 AND p.lon > -100 AND p.lon < -90 AS second_condition 
FROM position AS p 
JOIN trip_table t ON (t.tripid = p.tripid) 
WHERE (t.dep = 'CLE' OR t.arr = 'CLE') 
OR (p.lat > 34 AND p.lat < 40 AND p.lon > -100 AND p.lon < -90) 
+0

完美的简单解决方案 - 谢谢。 – TheOx 2012-04-27 20:55:48

2

我想你可以通过一个case语句识别的话,如下图所示。代码变得有点多余,但我已经在Oracle上测试了它,它可以工作:

SELECT p.*, 
     case when t.dep = 'CLE' or t.arr = 'CLE' then 'FROM_CLE_CLAUSE' 
      when (p.lat > 34 AND p.lat < 40 AND p.lon > -100 AND p.lon < -90) then 'OTHER_CLAUSE' 
     end 
    FROM position AS p 
    JOIN trip_table t 
    ON (t.tripid = p.tripid) 
WHERE (t.dep = 'CLE' OR t.arr = 'CLE) 
    OR (p.lat > 34 AND p.lat < 40 AND p.lon > -100 AND p.lon < -90) 
+0

良好的解决方案谢谢 - 投票了,但我接受了其他答案,因为它有一个简单的语法。 – TheOx 2012-04-27 20:57:05