SQL SELECT语句中的CAST和CASE

时间:2016-04-20 02:08:50

标签: sql sql-server sql-server-2008 casting

我正在尝试在某些条件为真时返回一个字符串,但是我遇到了数据类型问题...... LI.num_seats_pur和LI.num_seats_ret都是smallint数据类型......

这就是我被困的地方:

SELECT
CASE
  WHEN (LI.num_seats_ret = LI.num_seats_pur)
    THEN 'RET'
  ELSE (LI.num_seats_pur - LI.num_seats_ret)
END as 'Seats'

FROM T_LINEITEM LI;

我知道'RET'显然不是一个小的,但我在这里使用的每个CAST组合仍然会导致错误。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

使用CASE表达式时,如果返回值具有不同的数据类型,则它们将转换为具有较高data type precedence的数据类型。由于SMALLINT的优先级高于VARCHAR,因此ELSE部分的返回值'RET'会转换为SMALLINT。然后,这将转换为转换错误:

  

转换varchar值时转换失败' RET'数据类型smallint。

为了达到理想的效果,您需要CAST ELSE部分VARCHAR

SELECT
    CASE
        WHEN (LI.num_seats_ret = LI.num_seats_pur)
            THEN 'RET'
        ELSE 
            CAST((LI.num_seats_pur - LI.num_seats_ret) AS VARCHAR(10))
    END AS 'Seats'
FROM T_LINEITEM LI;