T-SQL中是否有一个异或运算符?

时间:2011-05-15 07:13:59

标签: tsql

这是我的陈述

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

对于两个参数来说,这不是什么大不了的事,但是有些过程有三个或四个只有一个可以传递,其余的应该为空。

3 个答案:

答案 0 :(得分:14)

不是很简洁,但你可以扩展出这样的逻辑:

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

答案 1 :(得分:1)

作为骗子,你可以这样做:

If @UserName+@EditorKey is null and coalesce(@UserName,@EditorKey) is not null

它更短,但这可能是它唯一的目标。

答案 2 :(得分:-1)

有一个按位XOR,但它不一定是你想要的:

http://msdn.microsoft.com/en-us/library/ms190277.aspx

在您的特定情况下,我发现更直接地重写它:

IF (@UserName IS NULL) = (@EditorKey IS NULL) BEGIN