将一个表的列中的数据与另一个表中的相同列进行比较

时间:2014-06-11 08:59:43

标签: postgresql

我分别有两个表temp和md。有一个名为uri_stem的字段,它有一些我要从temp而不是md中省略的细节。我需要做一个能够比较某些模式的比较,如果md中有类似的模式,则从temp中删除它们。

现在我正在使用此代码删除类似于我想要省略的模式的数据,但我想要一些方法能够比较md表中的模式而不是我对每个模式进行压缩。希望解释清楚。

FROM 
  spfmtr01.tbl_1c_apps_log_temp 
where 
 uri_stem not like '%.js' and 
 uri_stem not like '%.css' and 
 uri_stem not like  '%.gif' 
 and uri_stem not like '%.png' 
 and uri_stem not like '%.html' 
 and uri_stem not like '%.jpg' 
 and uri_stem not like '%.jpeg' 
 and uri_stem not like '%.ico' 
 and uri_stem not like '%.htm' 
 and uri_stem not  like '%.pdf' 
 and uri_stem not  like '%.Png' 
 and uri_stem not  like '%.PNG'

2 个答案:

答案 0 :(得分:0)

此示例基于我在评论中提到的answer

SQLFiddle

示例数据:

drop table if exists a, b;
create table a (testedstr varchar);
create table b (condstr varchar);

insert into a values 
   ('aa.aa.jpg'),
   ('aa.aa.bjpg'), -- no match
   ('aa.aa.jxpg'), -- no match
   ('aa.aa.jPg'), 
   ('aa.aa.aico'), -- no match
   ('aa.aa.ico'), 
   ('bb.cc.dd.icox'), -- no match
   ('bb.cc.dd.cco');  -- no match

insert into b values ('jpg'), ('ico');

说明:

    表格a中的
  • 我们有我们想要测试的字符串(存储在testedstr列中)
  • 表格b中的
  • 我们希望将字符串用作测试表达式(存储在condstr列中)

SQL:

with cte as (select '\.(' || string_agg(condstr,'|') || ')$' condstr from b)

select * from a, cte where testedstr !~* condstr;

说明:

  • 在第一行中,我们将要测试的所有模式聚合成一个字符串;因此,我们将获得jpg|ico字符串(聚合为单行)。
  • 在第二行中,我们使用我们的测试表达式(来自第一行)交叉测试表,并使用正则表达式来执行测试。
  • 最后的正则表达式看起来像\.(jpg|ico)$

对于旧版本,您应该使用@Bohemian提供的答案。对于我的样本数据,它看起来像(根据多个可能的点调整)(SQLFiddle

select 
  *
from 
  a
where 
  lower(reverse(split_part(reverse(testedstr),'.',1))) 
    not in (select lower(condstr) from b)

没有reverse函数(SQLFiddle):

select 
  *,
  lower(split_part(testedstr,'.',length(testedstr)- length(replace(testedstr,'.','')) + 1)) as extension
from 
  a
where 
  lower(split_part(testedstr,'.',length(testedstr)- length(replace(testedstr,'.','')) + 1)) not in (select lower(condstr) from b)

答案 1 :(得分:0)

首先让我们将许多条件重构为一个:

where lower(substring(uri_stem from '[^.]+$')) not in ('js', 'css', 'gif', 'png', 'html', 'jpg', 'jpeg', 'ico', 'htm', 'pdf')

在这种形式中,很容易看出如何选择值列表而不是编码:

where lower(substring(uri_stem from '[^.]+$')) not in (
    select lower(somecolumn) from sometable)

注意使用lower()来避免处理大小写的问题。

您也可以将其编码为连接:

select t1.*
from mytable t1
left join sometable t2
    on lower(somecolumn) = lower(split_part(uri_stem, '.', 2))
where t2.somecolumn is null -- filter out matches