Любой способ определить, какие строки были сгенерированы какими условиями в предложении where

У меня есть 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, которое тоже сработает.

РЕДАКТИРОВАТЬ: Если кому-то интересно, ПОЧЕМУ я хочу это сделать - результирующие позиции нанесены на карту, и я хотел бы покрасить их в зависимости от того, пришли ли они из ограниченного региона или из двух мест прибытия/отправления.


person TheOx    schedule 27.04.2012    source источник


Ответы (2)


Вы можете попробовать что-то вроде этого:

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)
person Mark Byers    schedule 27.04.2012

Я думаю, вы можете определить это с помощью оператора 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)
person msluyter    schedule 27.04.2012
comment
Спасибо за хорошее решение - проголосовали, но я принял другой ответ только потому, что у него был немного более простой синтаксис. - person TheOx; 28.04.2012