在CASE语句中使用IN而不重复输入表达式?

时间:2016-12-30 10:22:42

标签: sql-server tsql case

使用CASE语句时,我意识到根据documentation,我可以使用简单的CASE表达式,input_expression和{{1}对}}和when_expression值(在这些示例中假设result_expression中的值始终为正整数):

myField

或者我可以使用带有CASE [input_expression] WHEN [when_expression] THEN [result_expression] ... ELSE [result_expression] END CASE myField WHEN 1 THEN 'One' WHEN 2 THEN 'Two' WHEN 3 THEN 'Three' ELSE 'More than three' END CASE值对的搜索Boolean_expression表达式:

result_expression

我也知道在编写搜索的CASE WHEN [Boolean_expression] THEN [result_expression] ... ELSE [result_expression] END CASE WHEN myField = 1 THEN 'One' WHEN myField = 2 THEN 'Two' WHEN myField = 3 THEN 'Three' ELSE 'More than three' END 表达式时,我可以将IN运算符用作任何Boolean_expression的一部分:

CASE

在编写简单的CASE WHEN myField IN (1,2) THEN 'One or two' WHEN myField = 3 THEN 'Three' ELSE 'More than three' END 表达式时能够使用IN运算符非常有用,例如:

CASE

但是这不会运行并给出错误:

  

关键字' IN'附近的语法不正确。

显然我上面的例子是人为的,但有没有办法写一个简单的CASE myField WHEN IN (1,2,3) THEN 'Between one and three' WHEN IN (4,5,6) THEN 'Between four and six' WHEN IN (7,8,9) THEN 'Between seven and nine' ELSE 'More than nine' END 表达式并使用CASE运算符?

通过阅读MSDN上的语法,我理解这似乎是不可能的,因为简单的IN表达式是如何形成的 - 将CASE与每个input_expression进行比较以获得相等性 - 但我只是想知道是否有任何方式可以实现我所要求的,因为在每个when_expression条款中一次又一次地保存相同的字段名称是很方便的。搜索WHEN表达式。

1 个答案:

答案 0 :(得分:2)

不,这是不可能的。文档区分 when_expression Boolean_expression when_expression 始终使用相等运算符。

Aaron Bertrand在他的Dirty Secrets of the CASE expression中描述了这样的表达式

SELECT CASE @variable
  WHEN 1 THEN 'foo'
  WHEN 2 THEN 'bar'
END

评估为

SELECT
  WHEN @variable = 1 THEN 'foo'
  WHEN @variable = 2 THEN 'bar'
END

因此无法使用 when_expression 替换比较运算符。只有您已经提到的 Boolean_expression 才能实现这一点:

SELECT
  WHEN @variable IN (1,2) THEN 'foo'
  WHEN @variable in (3,4) THEN 'bar'
END