我正在尝试在某些条件为真时返回一个字符串,但是我遇到了数据类型问题...... 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组合仍然会导致错误。有什么想法吗?
答案 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;