实现'exclusive or'以返回一条记录



我正在尝试创建一个存储过程,实现排他或从表(BasisValues)返回特定记录。

表格如下:

Basis   Value
1       4.25
2       1.25
3       99.00
0       0.00

我设计了一个存储过程来返回BasisValue,如下所示:

CREATE PROCEDURE GetBasisValue
                    @Basis VARCHAR(2)
AS
BEGIN
    SELECT Value FROM BasisValues
    WHERE ( BASIS  = @Basis) OR 
        ((BASIS <> @Basis) AND (Basis = '0'))
END

正如你在上面看到的,我试图根据以下逻辑从BasisValues表中选择Value字段:
1. 如果Basis等于传递给存储过程的@Basis,则返回该值。
2. 如果Basis不等于传递给存储过程的@Basis,则返回Basis = 0的值。

然而,给定一个存在于表中的"基础",我最终得到两条记录。例如,如果我用@Basis为2调用GET_BASIS_VALUES,我得到:

Basis   Value
2   1.25
0   0.00

换句话说,无论如何,我总是返回'0'记录。我在逻辑上遗漏了什么?

您希望使用order by来选择首选值:

SELECT TOP 1 Value
FROM BasisValues
WHERE ( BASIS  = @Basis) OR 
      ((BASIS <> @Basis) AND (Basis = '0'))
ORDER BY (case when BASIS = @BASIS then 1 else 0 end) DESC;

该查询(不含top)将根据您在问题中描述的内容返回一个或两个值。然后,它将对结果排序,因此非默认的是第一个。通过选择order by之后的第一行,您首先获得匹配,然后如果没有匹配则默认。

CREATE PROCEDURE GetBasisValue
                    @Basis VARCHAR(2)
AS
BEGIN
    SELECT ISNULL((SELECT Value FROM BasisValues
    WHERE (BASIS  = @Basis)), '0.00')
END

答案不一定取决于默认基的值或它与其他可用选项的比较,您可以通过以下命令获得

SELECT Value FROM BasisValues
WHERE BASIS  = CASE WHEN EXISTS (SELECT * FROM BasisValues WHERE @Basis = BASIS ) THEN @Basis ELSE 0 END

如果你请求的基存在,返回记录的值,如果不存在,返回记录0

的值

最新更新