选择一个表中不存在模式匹配的记录

时间:2014-04-01 17:04:07

标签: sql regex postgresql

我想在一个表的列中找到不在另一个表的列中的所有记录。我可以使用此查询执行此操作:

SELECT
    kywd
FROM
    from_client
WHERE
    kywd NOT IN
        (SELECT
            kywd
        FROM
            from_me);

但是,我想扩展它以允许一些模式匹配。至少我想知道from_client kywd是否出现在from_me kywd的任何位置。所以,就像'%kywd%'一样。我尝试了...... WHERE '%' || kywd || '%' NOT IN ...作为一个狂野的猜测,实际上返回了结果集,但我怀疑这种语法只是乱码。

如何让这个select语句允许这些通配符?

4 个答案:

答案 0 :(得分:1)

SELECT from_client.kywd
FROM from_client
LEFT JOIN from_me
  ON from_client.kywd LIKE '%' || from_me.kywd || '%'
WHERE from_me.kywd IS NULL

答案 1 :(得分:1)

not exists可能比加入

更快
select kywd
from from_client
where not exists (
    select 1
    from from_me
    where position(from_client.kywd, kywd) > 0
)

答案 2 :(得分:0)

尝试这些方法。

SELECT
    kywd
FROM
    from_client
LEFT OUTER JOIN from_me ON 
from_client.kywd like from_me.kywd -- replace with whatever appropriate
WHERE
from_me.some_id IS NULL

用"替换为适当的",我的意思是:

from_client.kywd LIKE '%' || from_me.kywd || '%'

from_me.kywd LIKE '%' || from_client.kywd || '%'

或任何其他合适的条件。

答案 3 :(得分:0)

您可以尝试使用EXCEPT语句。在你的情节中它会像

 SELECT kywd
 FROM  from_client
 --WHERE <Conditions here>
 except
 SELECT kywd
 FROM  from_me
 --WHERE <Conditions here>

并返回from_me中不存在的from_client中存在的内容。