以何种方式识别哪些行是由where子句中的哪些条件生成的

时间:2012-04-27 20:27:53

标签: sql postgresql-9.1

我有2张桌子,一张包含行程的起点和终点位置,另一张表包含该行程中每分钟车辆的纬度/经度位置。这些表由tripID相关联。

这样的事情:

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)

我的问题是:是否可以修改此查询以确定结果的哪些行来自第一个条件(即行程离开/到达指定位置)以及哪个行来自第二个(即行程通过了指定纬度/经度)?

目前我唯一的想法是运行2个单独的查询,但我想避免这种情况,如果可以减少查询的总数。

如果对这类问题有一个标准的SQL解决方案,那就太好了;如果没有,那么是否有一个特定于PostgreSQL的解决方案也可以。

编辑:如果有人想知道为什么我想这样做 - 结果位置会在地图上绘制,我想根据它们是来自有界区域还是来自两个到达/离开地点之间的颜色编码

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:2)

我认为您可以通过案例陈述识别,如下所示。代码变得有点多余,但我已经在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)