SQL“案例x时”与“案例x时”的条件大于?

SQL“案例x时”与“案例x时”的条件大于?,sql,sql-server,tsql,select,Sql,Sql Server,Tsql,Select,这是一个关于在MS SQL中使用SELECT CASE的两种方法的问题[CASE WHEN X=Y]和[CASE X WHEN Y] 我试图根据字段的值为其定义存储桶。我需要使用范围,因此有必要使用标识符 举个简单的例子,我知道它是这样工作的: SELECT CASE WHEN x < 0 THEN 'a' WHEN X > 100 THEN 'b' ELSE 'c' END 但我如何使用此表单来指定如上所述的范围条件?比如: SELECT CASE X WHEN < 0 T

这是一个关于在MS SQL中使用SELECT CASE的两种方法的问题[CASE WHEN X=Y]和[CASE X WHEN Y]

我试图根据字段的值为其定义存储桶。我需要使用范围,因此有必要使用标识符

举个简单的例子,我知道它是这样工作的:

SELECT CASE WHEN x < 0 THEN 'a' WHEN X > 100 THEN 'b' ELSE 'c' END
但我如何使用此表单来指定如上所述的范围条件?比如:

SELECT CASE X WHEN < 0 THEN 'a' WHEN > 100 THEN 'b' ELSE "c" END
这个不行


谢谢大家!

没有第三种形式的案例-只支持搜索的和简单的案例*

您需要使用搜索的种类,即使用单独的条件,即使应用条件的变量始终相同

如果希望在X表示复杂表达式时避免在SQL中重复,请使用WITH子句或嵌套查询为所选表达式指定名称


*第一个示例的正式名称是searched CASE expression;您的第二个示例称为简单大小写表达式。

使用中间词看起来不会太糟糕:

SELECT CASE
WHEN X < 0 THEN 'a'
WHEN X BETWEEN 0   AND 100 THEN 'b' 
WHEN X BETWEEN 100 AND 200 THEN 'c' 
ELSE 'd' END

作为一种替代方法,请记住,可以对简单CASE语句的输入值进行数学运算。我经常使用ROUND来实现此目的,如下所示:

SELECT 
  CASE ROUND(X, -2, 1)
    WHEN 0   THEN 'b' -- 0-99
    WHEN 100 THEN 'c' -- 100-199
    ELSE 'a'          -- 200+
  END
由于您的示例既包括正面的开放范围,也包括负面的开放范围,因此此方法可能不适用于您

还有另一种方法:如果只考虑SELECT语句的可读性,可以编写标量值函数来隐藏所有混乱:

CREATE FUNCTION dbo.ufn_SortValuesIntoBuckets (@inputValue INT) RETURNS VARCHAR(10) AS
BEGIN
    DECLARE @outputValue VARCHAR(10);

    SELECT @outputValue = 
        CASE WHEN @inputValue < 0 THEN 'a'
             WHEN @inputValue BETWEEN 0 AND 100 THEN 'b'
             WHEN @inputValue > 100 THEN 'c'
        END;

    RETURN @outputValue;
END;
GO

最后一点考虑:在基准测试期间,我经常发现,您试图避免的搜索表单实际上比简单表单具有更好的性能,这取决于您有多少个案例。所以,如果性能是一个考虑因素,在你改变太多事情之前,做一点基准测试可能是值得的

这实际上是一个非常有趣的问题。它像

前面的答案中提到的SQL CASE表达式有两种形式:简单和搜索

但SQL标准也定义了 SQL:2003扩展案例表达式F262。这一功能很少被主要供应商采用


所谓的扩展case在when之后立即接受比较运算符,从而取消了简单case始终使用equals=比较的限制。下面的示例使用小于运算符。建议创建一个从参数返回此值的函数,然后您只需执行select myvalueX,@Rodolfo我很确定在这里使用UDF不是一个很好的解决方案。当您指的是范围时,是否要使用BEVER?@FreshPrinceOfSO您可能是对的,但根据我的经验,如果这个决策“矩阵”在很多地方都有使用,那么通常情况下,情况就更糟了maintainable@Rodolfo-如果您正在搜索值的范围,一个具有较低,上面和结果是更相关的答案-所以只是另一个连接而不是一个函数think@flup搜索的语法支持任意条件。@dasblinkenlight Simple case支持非相等运算符,它是在SQL标准中定义的。不幸的是,几乎没有任何一家主要供应商实施这项技术。
CREATE FUNCTION dbo.ufn_SortValuesIntoBuckets (@inputValue INT) RETURNS VARCHAR(10) AS
BEGIN
    DECLARE @outputValue VARCHAR(10);

    SELECT @outputValue = 
        CASE WHEN @inputValue < 0 THEN 'a'
             WHEN @inputValue BETWEEN 0 AND 100 THEN 'b'
             WHEN @inputValue > 100 THEN 'c'
        END;

    RETURN @outputValue;
END;
GO
SELECT dbo.ufn_SortValuesIntoBuckets(X); 
SELECT CASE X WHEN < 0 THEN 'a' 
              WHEN > 100 THEN 'b' 
              ELSE 'c' 
        END

C# 9.0
DeliveryTruck t when t.GrossWeightClass switch
{
    > 5000 => 10.00m + 5.00m,
    < 3000 => 10.00m - 2.00m,
    _ => 10.00m,
},
CASE x WHEN < 0   THEN '< 0'
       WHEN < 10  THEN '[0, 10['
       WHEN < 100 THEN '[10, 100['
       ELSE '>100'
END