2012-04-27 84 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