SQL“案例x时”与“案例x时”的条件大于?
这是一个关于在MS SQL中使用SELECT CASE的两种方法的问题[CASE WHEN X=Y]和[CASE X WHEN Y] 我试图根据字段的值为其定义存储桶。我需要使用范围,因此有必要使用标识符 举个简单的例子,我知道它是这样工作的: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
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