具有2种不同类型输出的SQL情况

时间:2016-06-16 22:27:15

标签: sql sql-server case

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?如果没有,还有另一种方式吗?

3 个答案:

答案 0 :(得分:1)

select case when c3 is null then CAST(c2 AS VARCHAR(10)) else c1 end from Table

您正在混合数字和字符串数据类型。您需要使用字符串VARCHARCHAR

通过投射数字数据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工作。