SQL удалить, где column_b не содержит column_a - PullRequest
0 голосов
/ 22 сентября 2018
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 голосов
/ 22 сентября 2018

Хранение списков вещей в строке - очень плохая идея в 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
                 );

Это безопаснее, чем «необработанное» сравнение строк, на случай, если домен был встроен в адрес электронной почты, но неполный домен.

0 голосов
/ 22 сентября 2018

Вы можете использовать strpos строковую функцию как:

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

Rextester Demo

0 голосов
/ 22 сентября 2018

Вы можете использовать условие not like:

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