2017-02-16 4 views
0

Я пытаюсь проанализировать строку, чтобы увидеть, отображаются ли значения из другой таблицы в ней в любой позиции.SQL: Как проверить строку для нескольких значений из другой таблицы

select ROUTE, 
case when ROUTE like '%' || b.AIRPORTCODE || '%' then 1 
else 0 end as CLASS_B, 
case when ROUTE like '%' || c.AIRPORTCODE || '%' then 1 
else 0 end as CLASS_C 
from FLIGHT_MESSAGE, 
(select * from CLASS_B_C_AIRPORTS where CLASS_B_C = 'B') b, 
(select * from CLASS_B_C_AIRPORTS where CLASS_B_C = 'C') c 

В таблице CLASS_B_C_AIRPORTS будет иметь код аэропорта (KDCA) и является ли он или нет «B» или «C».

В моем примере ROUTE поле будет содержать строку текста, как:

KDCA..FLUKY.DCA246.PAUKI..MOL.FLCON6.KRIC/0127 

Для этой строки, я хотел бы вернуться следующим, потому что KDCA класса В аэропорте и KRIC является Класс C:

| ROUTE           | CLASS_B | CLASS_C | 
---------------------------------------------------------------------- 
| KDCA..FLUKY.DCA246.PAUKI..MOL.FLCON6.KRIC/0127 | 1  | 1  | 

Этот запрос в настоящее время возвращает 0 для класса B и класса C в отношении этой строки.

+0

Итак, что же «1» представляют в результатах? 1 = true, 0 = false? (есть как минимум один код аэропорта CLASS_B в вашей строке и хотя бы один аэропорт CLASS_C)? Или они ** подсчитывают ** коды аэропортов CLASS_B и CLASS_C во входной строке? – mathguy

+0

Кроме того, как вы планируете избегать проблемы с «матерью в маме ** apy»? Что делать, если ваша строка ввода имеет подстроку MVFA, и есть аэропорт CLASS_B с кодом VFA или MVF? – mathguy

ответ

1

Я думаю, что это то, что вы хотите:

SELECT ROUTE, 
     MAX(CASE WHEN CLASS_B_C = 'B' THEN 1 ELSE 0 END) as CLASS_B, 
     MAX(CASE WHEN CLASS_B_C = 'C' THEN 1 ELSE 0 END) as CLASS_C 
FROM FLIGHT_MESSAGE fm JOIN 
    CLASS_B_C_AIRPORTS a 
    ON fm.ROUTE LIKE '%' || a.AIRPORTCODE || '%' 
GROUP BY ROUTE; 
+0

Это возвращает 0 для классов B и 1 для класса C. Оно должно быть 1 и 1. –

+0

@QuangNguyen. , , Я подозреваю, что с вашими данными что-то не так. Я думаю, что этот запрос должен делать то, что вы намерены (хотя вам может понадобиться «левое соединение»). –

+0

Это почти наверняка потребует некоторой доработки (работы с ОП), чтобы избежать проблемы «матери в химиотерапии». (Вы ищете код «мать», и вы находите его, случайно, во входной строке «che ** mother ** apy».) – mathguy

Смежные вопросы