【问题标题】:SQL case when with 2 different types of output具有 2 种不同类型输出时的 SQL 案例
【发布时间】:2016-06-16 22:27:15
【问题描述】:

表格

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?如果没有,还有其他方法吗?

【问题讨论】:

    标签: sql sql-server case


    【解决方案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
    

    【讨论】:

    • 不考虑转换 int>varchar 而不是 varchar>int,我觉得很愚蠢。对不起,谢谢!
    • @eric 不用担心,很高兴它有所帮助!即使在多年编写代码之后,我有时也会忘记演员阵容,并且不得不追查它发生在我们所有人身上的问题。 (我可以说全部吗?我想是的......)干杯
    【解决方案2】:

    从您的示例数据看来,您最好转换为 varchar 而不是转换为 int,因为根据 c3 中的值,输出将是字符串或整数。整数始终可以转换为 varchar,但 varchar 只能转换为整数,如果它是数字。通过检查,c1 中的项目不是数字。您可以使用转换或强制转换函数。

    【讨论】:

    • 不考虑转换 int>varchar 而不是 varchar>int,我觉得很愚蠢。对不起,谢谢!
    【解决方案3】:

    (代表 OP 发布)。

    我想除了将 int 转换为 varchar 之外,别无他法。但是 int>varchar 有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-06
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 2018-11-20
      • 2018-12-06
      相关资源
      最近更新 更多