Хорошо, я не собираюсь участвовать в еще одном бою с теми, кто говорит, что я не должен защищать изменения схемы базы данных (да, вы знаете, кто вы такой :-), но вот как я это сделаю ,
1/Если вы абсолютно не можете изменить схему, я бы разрешил ее с помощью кода (либо реального честного, либо добротного процедурного кода вне базы данных, либо как хранимую процедуру на любом языке, который разрешает ваша СУБД).
Это проверит базу данных для имени, отличного от yahoo, и вернет его, если есть. Если нет, он попытается вернуть имя yahoo. Если их нет, он вернет пустой набор данных.
2/Если вы можете изменить схему и хотите, чтобы SQL-запрос выполнял работу, вот как бы я это сделал. Создайте отдельный столбец в таблице, называемый CLASS, который, как ожидается, будет установлен в 0 для адресов, отличных от yahoo, и 1 для адресов yahoo.
Создайте триггеры вставки/обновления, чтобы изучить каждое добавление или изменение строки, задав КЛАСС на основе адреса электронной почты (с чего он заканчивается). Это гарантирует, что CLASS всегда будет правильно настроен.
Когда вы запрашиваете свою таблицу, закажите ее по имени и классу и выберите только первую строку. Это даст вам адрес электронной почты в следующем предпочтении: non-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"]
Это правильный способ решить эту проблему. – kquinn