В MySQL 5.7 я выполняю LEFT JOIN
, а предложение WHERE
вызывает мою пользовательскую функцию.Он не может найти подходящую строку, которую должен найти.
[Первоначально я немного упростил свой фактический код для целей этого поста.Однако, учитывая предложенный пользователем ответ, я публикую фактический код, так как он может быть релевантным.]
Моя пользовательская функция:
CREATE FUNCTION `jfn_rent_valid_email`(
rent_mail_to varchar(1),
agent_email varchar(45),
contact_email varchar(60)
)
RETURNS varchar(60)
BEGIN
IF rent_mail_to = 'A' AND agent_email LIKE '%@%' THEN
RETURN agent_email;
ELSEIF contact_email LIKE '%@%' THEN
RETURN contact_email;
ELSE
RETURN NULL;
END IF
END
Мой запрос:
SELECT r.RentCode, r.MailTo, a.AgentEmail, co.Email,
jfn_rent_valid_email(r.MailTo, a.AgentEmail, co.Email)
AS ValidEmail
FROM rents r
LEFT JOIN contacts co ON r.RentCode = co.RentCode -- this produces one match
LEFT JOIN link l ON r.RentCode = l.RentCode -- there will be no match in `link` on this
LEFT JOIN agents a ON l.AgentCode = a.AgentCode -- there will be no match in `agents` on this
WHERE r.RentCode = 'ZAKC17' -- this produces one match
AND (jfn_rent_valid_email(r.MailTo, a.AgentEmail, co.Email) IS NOT NULL)
Это не приводит к строкам.
Однако .Когда a.AgentEmail IS NULL
, если я только , меняется с
AND (jfn_rent_valid_email(r.MailTo, a.AgentEmail, co.Email) IS NOT NULL)
на
AND (jfn_rent_valid_email(r.MailTo, NULL, co.Email) IS NOT NULL)
, действительно правильно выдает соответствующую строку:
RentCode, MailTo, AgentEmail, Email, ValidEmail
ZAKC17, N, <NULL>, name@email, name@email
Итак, когда a.AgentEmail
равно NULL
(из несоответствующей строки LEFT JOIN
ed), почему в мире передача его функции как a.AgentEmail
действует иначе, чем передачаэто как литерал NULL
?
[Кстати: я считаю, что в прошлом я использовал этот тип конструкции под MS SQL-сервером, и он работал, как я и ожидал.Кроме того, я могу отменить тест AND (jfn_rent_valid_email(r.MailTo, a.AgentEmail, co.Email) IS NOT NULL)
до AND (jfn_rent_valid_email(r.MailTo, a.AgentEmail, co.Email) IS NULL)
, но я все еще не получаю соответствия.Как будто любая ссылка на a....
в качестве параметра функции не вызывает совпадения строки ...]