我正在尝试创建一个存储过程,实现排他或从表(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