Хорошо, я не собираюсь ввязываться в еще одну драку с теми, кто говорит, что я не должен защищать изменения схемы базы данных (да, вы знаете, кто вы :-), но вот как я это сделаю.
1 / Если вы абсолютно не можете изменить схему, я бы решил ее с помощью кода (либо реального процедурного кода, основанного на добросовестности, за пределами базы данных, либо в виде хранимой процедуры на любом языке, который позволяет ваша СУБД).
Это проверит базу данных на имя, отличное от Yahoo, и вернет его, если оно есть. Если бы не там, он попытался бы вернуть имя Yahoo. Если ни того, ни другого нет, будет возвращен пустой набор данных.
2 / Если вы можете изменить схему и хотите, чтобы SQL-запрос выполнял эту работу, вот как я это сделаю. Создайте в вашей таблице отдельный столбец с именем CLASS, для которого, как ожидается, будет установлено значение 0 для адресов, отличных от Yahoo, и 1 для адресов Yahoo.
Создание триггеров вставки / обновления для проверки каждого добавления или изменения строки, установка КЛАССА на основе адреса электронной почты (чем он заканчивается). Это гарантирует, что CLASS всегда будет установлен правильно.
Когда вы запрашиваете таблицу, упорядочиваете ее по имени и классу и выбираете только первую строку. Это даст вам адрес электронной почты в следующем предпочтении: не-Yahoo, Yahoo, пустой набор данных.
Что-то вроде:
select name, email
from tbl
where name = '[name]'
order by name, class
fetch first row only;
Если ваша СУБД не имеет эквивалента предложению DB2 «только для первой строки», вам, вероятно, все равно потребуется написать код для обработки только одной записи.
Если вы хотите обработать все имена, но только определенную желаемую электронную почту для этого имени, такой программы будет достаточно (мои взгляды на попытки использовать реляционную алгебру, такую как SQL, процедурным способом довольно жестоки, поэтому я здесь их не навязать):
# Get entire table contents sorted in name/class order.
resultSet = execQuery "select name, email from tbl order by name, class"
# Ensure different on first row
lastName = resultSet.value["name"] + "X"
# Process every single row returned.
while not resultSet.endOfFile:
# Only process the first in each name group (lower classes are ignored).
if resultSet.value["name"] != lastName:
processRow resultSet.value["name"] resultSet.value["email"]
# Store the last name so we can detect next name group.
lastName = resultSet.value["name"]