sql server中基于中间运算符的case语句编写

sql server中基于中间运算符的case语句编写,sql,sql-server,Sql,Sql Server,我有一个案例陈述,如下所示: SELECT CASE WHEN <expression>> BETWEEN 0 AND 10 THEN '0-10' WHEN <<expression>> BETWEEN 11 AND 20 THEN '11-20' WHEN <<expression>> BETWEEN 21 AND 30 THEN '21-30' ... SELECT CASE <expression>>

我有一个案例陈述,如下所示:

SELECT CASE 
WHEN <expression>> BETWEEN 0 AND 10 THEN '0-10'
WHEN <<expression>> BETWEEN 11 AND 20 THEN '11-20'
WHEN <<expression>> BETWEEN 21 AND 30 THEN '21-30'
...
SELECT CASE <expression>>
WHEN  BETWEEN 0 AND 10 THEN '0-10'
WHEN  BETWEEN 11 AND 20 THEN '11-20'
WHEN  BETWEEN 21 AND 30 THEN '21-30'
...
有人能告诉我我做错了什么吗

更新:


如前所述,我已经更改了问题中的查询,使范围成为独占的。

您可以尝试使用子查询

SELECT CASE 
WHEN ColName BETWEEN 0 AND 10 THEN '0-10'
WHEN ColName BETWEEN 10 AND 20 THEN '10-20'
WHEN ColName BETWEEN 20 AND 30 THEN '20-30'
...

FROM
(
 SELECT <<expression>> as ColName
 FROM tableName
) Z

由于BEVER语句的语法需要一个表达式作为其第一个参数进行测试,因此无法执行您想要执行的操作:

test_expression [ NOT ] BETWEEN begin_expression AND end_expression
因此,您必须使用第一种语法

另一方面,您的范围在使用包含范围之间有点不一致,但大小写表达式是按顺序计算的,因此范围实际上是:

WHEN <<expression>> BETWEEN  0 AND 10 THEN '0-10'
WHEN <<expression>> BETWEEN 11 AND 20 THEN '11-20'
WHEN <<expression>> BETWEEN 21 AND 30 THEN '21-30'

使用子查询,但还要更干净地优化案例:

SELECT ...,
  CASE 
    WHEN calc >= 100 THEN 'Over 100'
    ELSE CONCAT(calc * 10, ' - ', calc * 10 + 9)
  END AS range
FROM (SELECT *, FLOOR(<<expression>> / 10) as calc
     FROM tableName) x
FLOOR函数向下舍入到所提供数字下最接近的整数。首先将表达式IN除以10,然后再乘以10,就得到了表达式范围的开始。例如,如果表达式结果为63.4,则为63.4->6.34->6->60

如果对某个值的顶部范围没有要求,可以完全忽略该情况,只需CONCATcalc*10'-',calc*10+9即可处理任何范围内的值


注意,您的预期逻辑中有一个错误:范围应为0-9、10-19,。。。这个查询也解决了这个问题。

Case语句有两个变体,都有不同的思想

1. This is used when condition is dyanmically change and output also want to change
SELECT CASE 
WHEN <<expression>> or condition1 THEN output1
WHEN <<expression>> or condition2 THEN output2
WHEN <<expression>> or condition3 THEN output3
WHEN <<expression>> or condition4 THEN output4
END

2.  This is used when condition is same , only output is different same like swith case in c#.
SELECT CASE <<expression>> 
when result1 then output1
when result2 then output2
when result3 then output3
when result4 then output4
END
使用CTE:

;WITH cte as
(
    SELECT <expression>> AS Expression  FROM TableName
)

SELECT CASE
          WHEN Expression BETWEEN 0 AND 10 THEN '0-10'
          WHEN Expression BETWEEN 10 AND 20 THEN '10-20'
          WHEN Expression BETWEEN 20 AND 30 THEN '20-30'
       END AS C
FROM cte
如果表达式始终>0且间隔是连续的,则可以进一步缩短它:

SELECT CASE
          WHEN Expression <= 10 THEN '0-10'
          WHEN Expression <= 20 THEN '10-20'
          WHEN Expression <= 30 THEN '20-30'
       END AS C
FROM cte

使用交叉/外部应用于此

DECLARE @a AS TABLE (
a int ,
b INT
);

INSERT INTO @a VALUES (1,2),(4,5),(4,1),(21,32),(32,21),(43,2);


SELECT CASE 
WHEN expr BETWEEN 0 AND 10 THEN '0-10'
WHEN expr BETWEEN 11 AND 20 THEN '11-20'
WHEN expr BETWEEN 21 AND 30 THEN '21-30'
END

FROM @a 
CROSS APPLY (SELECT  CASE WHEN a > b THEN a ELSE b END expr) b

在您的特殊情况下,可以执行以下技巧。总的来说-是的-我也错过了这个选项。 将tst设置为从值100,95中选择end_n::bigint、start_n::bigint, 100,90100,80100,70100,60100,50100,40100,30A结束,开始 选择tst.*,结束\n-开始\n/10, 案例结束\u n-开始\u n/10 当为0时,则为“bucket\u 0\u 10” 当1时,则为“bucket\u 10\u 20” 当2时,然后是“桶10\u 30” 其他“bucket\u other” 终止 来自tst


但它是静态的。使用上述技巧的简单查询,没有任何案例会使其成为动态的

选择1-10、11-20、。。。或者0-9,10-19,…,因为0-10,11-20。。。为第一个术语创建一个特殊的边格,使简单性变得不可能。@Bohemian-我不确定我是否得到了它。.对于您当前编码的范围,第一个范围0-10跨越11个值,而所有其他范围,例如11-20、21-39等,仅跨越10个值。如果您想使用数学方法(如我的答案中的方法),这种异常会造成不必要的困难。问题是OP希望消除case语句中的重复表达式,而使用简单的case语句语法。我理解,但它使代码看起来不那么难看,这部分回答了他的问题。重点是OP希望消除case语句中的重复表达式,而使用简单的case语句语法。这并不能实现这一点。@jpw,你是对的。但这里不可能有简单的版本。因此,在这种情况下,我尽可能缩短了时间。
SELECT CASE
          WHEN Expression <= 10 THEN '0-10'
          WHEN Expression <= 20 THEN '10-20'
          WHEN Expression <= 30 THEN '20-30'
       END AS C
FROM cte
DECLARE @a AS TABLE (
a int ,
b INT
);

INSERT INTO @a VALUES (1,2),(4,5),(4,1),(21,32),(32,21),(43,2);


SELECT CASE 
WHEN expr BETWEEN 0 AND 10 THEN '0-10'
WHEN expr BETWEEN 11 AND 20 THEN '11-20'
WHEN expr BETWEEN 21 AND 30 THEN '21-30'
END

FROM @a 
CROSS APPLY (SELECT  CASE WHEN a > b THEN a ELSE b END expr) b