Есть несколько частей, объясняющих это:
- Прежде всего, вы делаете левое соединение с этими таблицами, поэтому наличие или отсутствие данных в таблицах контактов / адресов не уменьшитчисло записей в выходных данных.
- Если вы ожидали ничего не получать из-за примененных фильтров, вы должны знать, что поведение фильтрации таблицы в условии соединения не совпадает с фильтрацией таблицы вусловие where:
- Фильтр применяется в объединении: фильтр выполняется перед продолжением объединения таблиц
- Фильтр применяется в where: фильтр выполняется после объединения таблиц
Поэтому, если вы хотите ничего не получить, просто переместите фильтр в «части соединения» в «часть где».
Отредактированный ответ
Просто чтобы объяснить мой комментарий ...
with customer as (
select 375 as id, 'aurelie' as nom, 'lilie' as prenom union all
select 389, 't(', null
),
contact as (
select 2740 as id, 'aurelie@mail.com' as valeur, 375 customer_id union all
select 2739, '06 06 06 06 06', 375
)
select *
from customer cs
left join contact c
on cs.id=c.customer_id
where c.valeur like '%%'
and cs.nom like '%t(%'
Это ничего не возвращает, потому что вы сравниваете NULL с like '%%'
Если вы замените это where c.valeur like '%%'
к этому where c.valeur is null
вы получитеон запись, которую вы ищете.Если вы хотите продолжать использовать это where c.valeur like '%%'
всегда, вам нужно будет преобразовать нули в некоторую строку, например, в пустую строку where isnull(c.valeur,'') like '%%'
, и это тоже должно работать.Надеюсь, это поможет, вы можете проверить это отсюда