Подтвердить что ты не робот

Есть ли эксклюзивный оператор 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 имеют три или четыре, где только один может быть передан, а остальное должно быть нулевым.

4b9b3361

Ответ 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

Это короче, но это может быть единственное, что у него есть.