代码之家  ›  专栏  ›  技术社区  ›  er4z0r

检查某列的值是否包含另一列的值

  •  7
  • er4z0r  · 技术社区  · 14 年前

    我有一个包含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 回复  |  直到 14 年前
        1
  •  18
  •   Raphaël Althaus    14 年前

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

    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

        2
  •  2
  •   John Woo    14 年前

    试试这个,

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

    SQLFiddle Demo

        3
  •  0
  •   WojtusJ    14 年前

    试试这样的东西:

    SELECT distinct a.pkg FROM TAB_1 as a INNER JOIN TAB_2 as b ON a.pkg LIKE CONCAT('%', b.path_fragment, '%')
    
        4
  •  0
  •   Gabriel    14 年前

    你可以这样做:

    select p.id, pkg from packages p
    inner join frameworks f on 
    p.pkg like concat('%',f.path_fragment,'%')