如果列的值匹配,则删除所有与特定ID对应的行

时间:2019-03-26 11:43:03

标签: sql postgresql

如果其中一行的某一列的值与所查找的值匹配,我试图删除所有包含ID的行

我有下表:

表1:

|   ID   |  |  offer    |
-------------------------
|   001  |  |  'SE;SL'  |
|   001  |  |   'WX'    |
|   001  |  |   'PW'    |

|   002  |  |   'WS'    |
|   002  |  |   'EL'    |

|   003  |  |   'SE'    |

|   004  |  |   'ZS'    |
|   004  |  |'PW;SE;ODL'|
SELECT  ID,
        offer
FROM table1
GROUP BY 
         ID,
         offer,
HAVING sum(case when offer LIKE '%SE%' then 1 else 0 end) = 0

目前,我可以删除该行,如下所示:

|   ID   |  |  offer    |
-------------------------
|   001  |  |   'WX'    |
|   001  |  |   'PW'    |

|   002  |  |   'WS'    |
|   002  |  |   'EL'    |

|   004  |  |   'ZS'    |

预期结果

|   ID   |  |  offer    |
-------------------------
|   002  |  |   'WS'    |
|   002  |  |   'EL'    |

如您所见,我尝试将“报价”列的其中一行中至少出现一次“ SE”的所有ID隔离。

如果有人可以帮助我理解,我尝试了很多事情,做了几次搜索都没有成功!

非常感谢

2 个答案:

答案 0 :(得分:1)

不存在

SELECT  ID,
        offer
FROM table1 t1
where not exists ( select 1 from  table1 t2 where t1.id=t2.id
                        and t2.offer like '%SE%')

答案 1 :(得分:1)

使用NOT EXISTS,但是您还必须检查所搜索的值是否不属于另一个值的情况。
因此,请在开头和结尾处将;与offer列和值连接起来:

select id, offer
from table1 t
where not exists ( 
  select 1 from  table1 
  where 
    id=t.id
    and 
    ';' || offer || ';' like '%;SE;%'
)

修改
将最后一行替换为:

chr(59) || offer || chr(59) like '%' || chr(59) || 'SE' || chr(59) || '%'