【问题标题】:Converting string to integer and then converting back to string将字符串转换为整数,然后再转换回字符串
【发布时间】:2019-08-21 19:10:04
【问题描述】:

我有一些这样的更新语句:

UPDATE tmp
    SET MyVarCharColumn1 = ISNULL(SomeOtherVarCharColumn,0)
FROM #myTempTable tmp;

注意 MyVarCharColumn1VarChar() 类型,但在现实生活中它只会有类似数字的值。

现在我想将其更改为 ADD 一个数值,例如 10 的整数值到 MyVarCharColumn1 的最终值,然后再次将其转换回 VARCHAR() .

例如,如果当前是 "23" 现在我希望它是 "33"

在该更新语句中进行转换并且还可以处理空字符串的安全方法是什么?

【问题讨论】:

    标签: sql tsql sql-server-2012


    【解决方案1】:

    如果真的是数字,可以这样做:

    UPDATE tmp
        SET MyVarCharColumn1 = MyVarCharColumn1 + 10
    FROM #myTempTable tmp;
    

    如果您已经在另一列设置值:

    UPDATE tmp
        SET MyVarCharColumn1 = COALESCE(SomeOtherVarCharColumn, 0) + 10
    FROM #myTempTable tmp;
    

    SQL Server 会将+ 解释为加法,而不是字符串连接。然后它将第一个参数转换为数字并进行加法。它将被保存为字符串,因为那是列的类型。

    我建议这样做,因为您不应该混合这样的类型。更好的是将该列转换为适当的数字,例如:

    alter table tmp alter column MyVarCharColumn1 numeric(10, 0);
    

    【讨论】:

    • 是的,糟糕的数据库设计。我必须遵循他们所拥有的。 ...所以你的意思是基本上再添加一个这样的SET? SET MyVarCharColumn1 = ISNULL(SomeOtherVarCharColumn,0) 然后下一行 SET MyVarCharColumn1 = MyVarCharColumn1 + 10
    • @Bohn 。 . .不,您应该只设置一次列。
    • @Bohn 答案基于data type precedence
    【解决方案2】:

    为什么不准确地表达你想要的?

    update a
       set a.Col1 = Convert(varchar, (Convert(int, IsNull(NullIf(a.Col1, ''), '0')) + 10))
    from #myTempTable a;
    

    分成几个步骤:

    1. 选择值a.Col1
    2. 将空字符串转换为空NullIf(<value>, '')
    3. 将空字符串转换为零字符串IsNull(<value>, '0')
    4. 将值转换为int Convert(int, <value>)
    5. 将值加 10 (<value> + 10)
    6. 将值转换为字符串Convert(varchar, <value>)

    【讨论】:

    • 是的,类似的......这也能处理空字符串吗?我希望空字符串被视为 null,因此我可以用零替换它们
    • @Bohn Aye,这会将 null 和 empty 视为零;添加了细分。
    • 太棒了。谢谢。
    • @Bohn 嗯嗯? NullIf 自 SQL 2005 以来一直存在。
    • 哦,2005 年?哦很酷,那么我们可以使用它.. 不知何故,我认为它是 2016 年添加的,哈哈
    【解决方案3】:

    尝试使用以下代码更新 set 行以将其增加 10

    UPDATE tmp
    SET MyVarCharColumn1 = ISNULL(SomeOtherVarCharColumn,0)
    SET MyVarCharColumn1 = MyVarCharColumn1 + 10
    FROM #myTempTable tmp;
    

    这会将 MyVarCharColumn1 列中的每个单元格增加 10,如果要添加特殊条件,可以使用 WHERE

    编辑 2:

    我现在添加了 ISNULL,所以我现在代码将首先运行 line 来查看它是否为 number,如果不是,它将设置为 0,如果是 number,它不会将其设置为零,并将进入下一个增加 10 的线

    【讨论】:

    • 在给出解决方案时,始终显示 OP 需要的全部工作,而不仅仅是一行。并说明您做了什么以及可以在哪些方面进行改进。
    • 希望现在好了,谢谢你的帮助,因为我还在学习堆栈溢出问题
    • 原来存在的 ISNULL 发生了什么?我希望它仍然能够处理 null 和空字符串并将其视为值零
    • 我想你现在可以试试,因为我添加了 ISNULL
    • update 语句不允许set 多次。
    猜你喜欢
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    相关资源
    最近更新 更多