Есть несколько способов справиться с этим:
COALESCE
для возврата первого значения не NULL
( SQL Fiddle ) SELECT Personnel.Name, COALESCE(InternalRoles.Name, ExternalRoles.Name, 'Unknown') AS RoleName FROM Personnel LEFT OUTER JOIN InternalRoles ON InternalRoles.ID = Personnel.InternalRoleID AND Personnel.ExternalRoleID IS NULL LEFT OUTER JOIN ExternalRoles ON ExternalRoles.ID = Personnel.ExternalRoleID AND Personnel.InternalRoleID IS NULL
ISNULL
для возврата второго значения, если заданное значение NULL
( SQL Fiddle ) SELECT Personnel.Name, ISNULL(InternalRoles.Name, ExternalRoles.Name) AS RoleName FROM Personnel LEFT OUTER JOIN InternalRoles ON InternalRoles.ID = Personnel.InternalRoleID AND Personnel.ExternalRoleID IS NULL LEFT OUTER JOIN ExternalRoles ON ExternalRoles.ID = Personnel.ExternalRoleID AND Personnel.InternalRoleID IS NULL
CASE
для определения поведения if-then-else ( SQL Fiddle ) SELECT Personnel.Name, CASE WHEN Personnel.InternalRoleID IS NOT NULL THEN InternalRoles.Name ELSE ExternalRoles.Name END AS RoleName FROM Personnel LEFT OUTER JOIN InternalRoles ON InternalRoles.ID = Personnel.InternalRoleID AND Personnel.ExternalRoleID IS NULL LEFT OUTER JOIN ExternalRoles ON ExternalRoles.ID = Personnel.ExternalRoleID AND Personnel.InternalRoleID IS NULL
Реально, единственное, что вам нужно будет сделать, - это то, что лучше всего подходит стиль вашего запроса, так как все они имеют одинаковые планы выполнения и относительно одинаковое время выполнения. Лично я бы рекомендовал использовать COALESCE
, так как он позволяет отображать значение по умолчанию, если одно из значений Name в ваших таблицах Internal / ExternalRoles оказывается NULL
, если вы этого хотите.