最后的WHEN表达式会覆盖CASE WHEN中的第一个WHEN表达式的结果,在SQL SELECT语句中

时间:2019-05-09 17:54:41

标签: sql-server case

对于本社区的大多数人来说,这似乎很熟悉,因为它全都涉及sp表达式。但是我现在将以分类模式进行操作,而不是进行实际的实现。我感谢是否有解决此问题的最佳方法。

场景:

我有一条select语句,其中从表中检索多列。该表中的列大多具有SQL CASE数据类型。我选择此数据类型是因为我认为如果需要显示numeric(10, 3)值,则转换会更容易,反之亦然。这是表结构。

名称:int

列:

FleetRange

Critera:

当前结果:

current query result

我的SQL查询:

CaptionID INT NOT NULL 
Caption   NVARCHAR(50) 
FleetRange_1      numeric(10,3)
FleetRange_2_4    numeric(10,3)
.......
Total     numeric(10,3)

注意:

当前发生的情况是,最后一个SELECT CaptionId, Caption, CASE WHEN CaptionId IN (1, 2, 4, 5, 6, 7, 8, 9, 14, 15, 17, 18, 20, 21, 22, 23) THEN CONVERT(INT, FleetRange_1) WHEN CaptionId IN (11, 12, 13) THEN CONVERT(NUMERIC(10, 2), FleetRange_1) WHEN CaptionId IN (3, 10, 16, 19) THEN CONVERT(NUMERIC(10, 3), FleetRange_1) END AS 'FleetRange_1' FROM FleetRange 会覆盖先前的求值结果,因此即使有整数值,每一行也会显示3个WHEN位置的值。

我对其他decimal应用了相同的大小写结构,因此缩短了查询时间。

我也尝试了下面的语法,而不是上面的查询中写的numeric(10,3)-没什么区别。

case

我的期望(期望的实际结果):我的目标是-如果特定的WHEN CaptionId = 11 OR CaptionId = 12 OR CaptionId = 13 THEN... 表达式具有特定的{{ 1}}被评估。

如下所示:

numeric

1 个答案:

答案 0 :(得分:1)

查询中的每个表达式都具有单个数据类型。 CASE表达式的数据类型为:

  

的类型集中的最高优先级类型   result_expressions和可选的else_result_expression。

CASE (TSQL)

然后查看Data Type Precedence

如果您要为单个结果集中的不同行设置不同的显示格式,则必须将它们转换为字符串,然后Format自己转换。