表
c1 c2 c3
'a1' 1 'hi'
'b1' 2 'hee'
'c1' 3 null
当我这样做时
select case when c3 is null then c2 else c1 end from Table
我得到一个"转换失败转换"错误。
我知道这种情况什么时候只能返回1种类型,但有没有办法将varchar转换为int / tinyint?如果没有,还有另一种方式吗?
答案 0 :(得分:1)
select case when c3 is null then CAST(c2 AS VARCHAR(10)) else c1 end from Table
您正在混合数字和字符串数据类型。您需要使用字符串VARCHAR
,CHAR
等
通过投射数字数据CAST(c2 AS VARCHAR(10))
,您可以解决问题。
我觉得有趣并且在sql-server中更准确,你可以将它保持为integer
,但它需要cast as sql_variant
,这将使整个字段sql_variant
和此后需要施放以获得任何用途,你将获得 0好处,因为你总是可以测试IIF(ISNUMERIC(CASE)=1,CAST(value as INT),NULL)
....这个答案可能太多了。
DECLARE @Table AS TABLE (C1 CHAR(2), c2 INT, c3 VARCHAR(4))
INSERT INTO @Table (C1, c2, c3)
VALUES ('a1', 1, 'hi'), ('b1',2,'hee'),('c1',3,null)
SELECT *
,CASE WHEN c3 is null THEN CAST(c2 AS sql_variant) else c1 end
FROM
@Table
答案 1 :(得分:0)
从您的示例数据看起来您最好转换为varchar而不是转换为int,因为根据c3中的值,输出将是字符串或整数。一个整数总是可以转换为varchar,但是如果varchar是一个数字,则只能将其转换为整数。通过检查,c1中的项目不是数字。您可以使用转换或强制转换功能。
答案 2 :(得分:0)
(代表OP发布)。
我想除了转换为int到varchar以外,别无他法。但int> varchar工作。