Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 实现“异或”返回一条记录_Sql_Sql Server 2008_Stored Procedures_Logical Operators - Fatal编程技术网

Sql 实现“异或”返回一条记录

Sql 实现“异或”返回一条记录,sql,sql-server-2008,stored-procedures,logical-operators,Sql,Sql Server 2008,Stored Procedures,Logical Operators,我试图创建一个存储过程,该过程实现一个异或,以从表BasisValues返回一条特定记录 这是桌子: Basis Value 1 4.25 2 1.25 3 99.00 0 0.00 我设计了一个存储过程来返回基本值,如下所示: CREATE PROCEDURE GetBasisValue @Basis VARCHAR(2) AS BEGIN SELECT Value FROM BasisVal

我试图创建一个存储过程,该过程实现一个异或,以从表BasisValues返回一条特定记录

这是桌子:

Basis   Value
1       4.25
2       1.25
3       99.00
0       0.00
我设计了一个存储过程来返回基本值,如下所示:

CREATE PROCEDURE GetBasisValue
                    @Basis VARCHAR(2)
AS
BEGIN
    SELECT Value FROM BasisValues
    WHERE ( BASIS  = @Basis) OR 
        ((BASIS <> @Basis) AND (Basis = '0'))
END
换句话说,无论发生什么情况,我总是返回“0”记录。就我的逻辑而言,我缺少什么?

您想使用order by选择首选值:

CREATE PROCEDURE GetBasisValue
                    @Basis VARCHAR(2)
AS
BEGIN
    SELECT ISNULL((SELECT Value FROM BasisValues
    WHERE (BASIS  = @Basis)), '0.00')
END
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;

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

答案不必取决于默认基础的值或它与其他可用选项的比较方式,您可以通过以下方式获得

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

这意味着,如果您要求的基准存在,则返回该记录的值,如果不存在,则返回记录0的值

因此,如果我在您提供的示例中提供值@basis='4',结果应该是什么?@dotnetom 4的基准应返回0。基本上,任何不在表中的基都应该返回0。order by中的case子句是否仅用于处理小于0的基值?@Donal。这就是手术室所做的。
SELECT Value FROM BasisValues
WHERE BASIS  = CASE WHEN EXISTS (SELECT * FROM BasisValues WHERE @Basis = BASIS ) THEN @Basis ELSE 0 END