这可能是因为 e.login 为 NULL,当比较 NULL 值(如您的情况为 NOT IN)时,它总是返回 false(请参阅文档:运算符 NOT LIKE也适用于 NOT IN)。
您可以使用COALESCE()来检查这一点:
返回列表中的第一个非 NULL 值,如果没有非 NULL 值,则返回 NULL。
所以在你的情况下:
SELECT e.*
FROM emails AS e
WHERE e.error <> 1
AND COALESCE(e.login,'') NOT IN (select email_login from accounts)
如果这不起作用,请尝试根据应该如何精确比较 LIKE 运算符或修剪值以避免由于前导或尾随空格而导致的差异
使用 %LIKE%:
SELECT e.*
FROM emails AS e
WHERE e.error <> 1
AND NOT EXISTS (SELECT email_login
FROM accounts
WHERE email_login LIKE CONCAT('%', e.login ,'%'))
请注意,% 匹配任意数量的字符,包括零个字符
要匹配确切的登录名:
SELECT e.*
FROM emails AS e
WHERE e.error <> 1
AND NOT EXISTS (SELECT email_login
FROM accounts
WHERE UPPER(TRIM(email_login)) = UPPER(TRIM(e.login)))