SQL删除其中列_b不';不包含列a

SQL删除其中列_b不';不包含列a,sql,postgresql,sql-delete,Sql,Postgresql,Sql Delete,我想删除“电子邮件”中不包含“域”的所有行 因此,在上面的例子中,应该删除#2和#3,只剩下#1 对于一个有经验的SQL用户来说,这可能很简单,但作为一个新手,在搜索之后,我不知道如何做到这一点。任何方向正确的领导都将不胜感激 我正在使用PostgreSQL。您可以使用不相似的条件: domain | email ------------|--------------------- banana.com | user@banana.com,user@gmail.com pear.co

我想删除“电子邮件”中不包含“域”的所有行

因此,在上面的例子中,应该删除#2和#3,只剩下#1

对于一个有经验的SQL用户来说,这可能很简单,但作为一个新手,在搜索之后,我不知道如何做到这一点。任何方向正确的领导都将不胜感激


我正在使用PostgreSQL。

您可以使用
不相似的条件:

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

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

DELETE FROM mytable
WHERE  email NOT LIKE '%' || domain || '%'
这比“原始”字符串比较更安全,以防域嵌入到电子邮件地址中,而不是整个域。

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

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

MySQL中的
|
?除非你启用了一些sql模式(PIPES_AS_CONCAT)@RaymondNijland-OP说“我在使用PostgreSQL”OP说“我在使用PostgreSQL”o甚至没有注意到..我看到了标签MySQL并浏览了MySQL标签。你可能想把单词边界逻辑放到比较中。
delete from tab where strpos(email,domain)=0;