SQL删除,其中column_b不包含column_a

时间:2018-09-22 15:58:11

标签: sql postgresql sql-delete

domain      | email
------------|---------------------
banana.com  | user@banana.com,user@gmail.com
pear.com    | user@yahoo.com
grape.com   | user@aol.com

我要删除“电子邮件”中未包含“域”的所有行。

因此,在上面的示例中,应该删除#2和#3,仅保留#1。

对于经验丰富的SQL用户来说,这可能很简单,但是作为一个新手,经过搜索,我不知道该怎么做。朝正确方向的任何领先者都将受到赞赏。

我正在使用PostgreSQL。

3 个答案:

答案 0 :(得分:2)

您可以将strpos字符串函数用作:

delete from tab where strpos(email,domain)=0;

Rextester Demo

答案 1 :(得分:1)

您可以使用not like条件:

DELETE FROM mytable
WHERE  email NOT LIKE '%' || domain || '%'

答案 2 :(得分:0)

在字符串中存储内容列表在SQL中是一个非常糟糕的主意。在Postgres中,您可以取消电子邮件的嵌套,然后与域进行比较:

select t.*
from t
where not exists (select 1
                  from unnest(string_to_array(str, ','::text)) u(email)
                  where u.email like '%@' || t.domain
                 );

这比“原始”字符串比较更安全,以防万一该域嵌入在电子邮件地址中,而不是整个域。