SQL:如何检查字符串中来自另一个表的多个值

SQL:如何检查字符串中来自另一个表的多个值,sql,oracle,Sql,Oracle,我试图解析一个字符串,以查看另一个表中的值是否以任何位置出现在该字符串中 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 CLA

我试图解析一个字符串,以查看另一个表中的值是否以任何位置出现在该字符串中

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是B级机场,而KRIC是C级机场:

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

此查询当前针对该字符串返回B类和C类的0。

我想这就是您想要的:

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;

这是为B类返回0,为C类返回1。它应该是1和1。@Quangngguyen。我怀疑你的数据有问题。我认为这个查询应该按照您的意愿进行(尽管您可能需要
左连接
)。这几乎肯定需要一些改进(与OP一起工作),以避免“母亲正在化疗”问题。(您正在搜索代码“mother”,无意中在输入字符串“chemistry”中找到了它。)那么,“1”在您的结果中代表什么?1=真,0=假?(字符串中至少有一个B类机场代码和至少一个C类机场)?或者它们是输入字符串中B类和C类机场代码的计数?另外,您计划如何避免“母亲正在化疗”问题?如果您的输入字符串具有子字符串MVFA,并且存在代码为VFA或MVF的B类机场,该怎么办?