Есть ли эксклюзивный оператор OR в T-SQL?
Это мое утверждение
IF (@UserName IS NULL AND @EditorKey IS NULL) OR (@UserName IS NOT NULL AND @EditorKey IS NOT NULL) BEGIN
RAISERROR ('One of @UserName, @EditorKey must be non-null.', 15, 0)
RETURN
END
Я хочу, чтобы я мог сделать что-то вроде этого:
IF (@UserName IS NOT NULL) XOR (@EditorKey IS NOT NULL) BEGIN
RAISERROR ('One of @UserName, @EditorKey must be non-null.', 15, 0)
RETURN
END
Для двух параметров это не так уж и важно, но некоторые procs имеют три или четыре, где только один может быть передан, а остальное должно быть нулевым.
Ответы
Ответ 1
Не очень лаконично, но вы можете расширить логику следующим образом:
WHERE
(NOT ((@UserName IS NOT NULL) AND (@EditorKey IS NOT NULL))) AND
((@UserName IS NOT NULL) OR (@EditorKey IS NOT NULL))
Или используйте побитовый оператор XOR (^):
WHERE
(CASE WHEN (@UserName IS NOT NULL) THEN 1 ELSE 0 END) ^
(CASE WHEN (@EditorKey IS NOT NULL) THEN 1 ELSE 0 END) = 1
Вы можете использовать аналогичный подход, где есть три или четыре параметра, и точно одно должно иметь значение:
WHERE
(CASE WHEN (@Var1 IS NOT NULL) THEN 1 ELSE 0 END) +
(CASE WHEN (@Var2 IS NOT NULL) THEN 1 ELSE 0 END) +
(CASE WHEN (@Var3 IS NOT NULL) THEN 1 ELSE 0 END) +
(CASE WHEN (@Var4 IS NOT NULL) THEN 1 ELSE 0 END) = 1
Ответ 2
Там побито XOR, но это не обязательно то, что вы хотите:
http://msdn.microsoft.com/en-us/library/ms190277.aspx
В вашем конкретном случае я нахожу более непосредственным, чтобы переписать его так:
IF (@UserName IS NULL) = (@EditorKey IS NULL) BEGIN
Ответ 3
Как обманщик, вы можете сделать:
If @[email protected] is null and coalesce(@UserName,@EditorKey) is not null
Это короче, но это может быть единственное, что у него есть.