5

我有一个带有 java 包名称的表:

|id|pkg|
|1 |some.long.package.path|
|2 |com.admob.bla|

和一个包含部分包名称的表形成已知的广告框架。

|id|path_fragment|
|1 |.admob |

如何检索 pkg 值包含任何 ad_frameworks.path_fragment 的包?

我只是找不到子字符串检查。我发现的只是人们使用 like 来比较一些字符串文字,但从不用于比较列。

注意:我正在使用 MySQL。

4

4 回答 4

17

认为你可以用like来做一个内部连接

select p.id, p.pkg
from package p
inner join ad_frameworks adf on p.pkg like CONCAT('%', adf.path_fragment, '%')
--group by p.id, p.pkg

或者正如你所指出的

select * 
from package p
inner join ad_frameworks adf on LOCATE(adf.fragment, p.pkg) > 0

或者

select * 
from package p
inner join ad_frameworks adf on INSTR( p.pkg,adf.fragment) > 0

或者

select * 
from package p
inner join ad_frameworks adf on POSITION(adf.fragment IN p.pkg) > 0

或者

select * 
from package p
inner join ad_frameworks adf on REPLACE(p.pkg, adf.fragemnt, '') <> p.pkg

好吧,你的选择很少;)

SqlFiddle

于 2012-09-14T12:43:48.257 回答
2

试试这个,

SELECT  a.*, b.*
FROM    package a, ad_frameworks b
WHERE   a.pkg LIKE CONCAT('%',b.path_fragment,'%')

SQLFiddle 演示

于 2012-09-14T12:49:35.680 回答
0

尝试这样的事情:

SELECT distinct a.pkg FROM TAB_1 as a INNER JOIN TAB_2 as b ON a.pkg LIKE CONCAT('%', b.path_fragment, '%')
于 2012-09-14T12:50:52.153 回答
0

你可以这样做:

select p.id, pkg from packages p
inner join frameworks f on 
p.pkg like concat('%',f.path_fragment,'%')
于 2012-09-14T12:50:53.243 回答