如何安全地将varchar(255)转换为int?

3
我使用了一个列在case表达式中,并且在server1上运行良好。但是当我在server2上运行时,由于该列的值为'false',因此失败了。
这个列是一个varchar(255),但是在我的case表达式中,我将其用作INT类型使用。尽管它之前工作得很好,但现在它在server2上由于'false'的值而失败了。
我如何安全地转换为INT,并且如果转换失败,则默认为0?
这是否有可能实现?
我的查询看起来像:
UPDATE t1
     set 
          c1 = ISNULL(
                     (
                       SELECT CASE c2
                            WHEN 123 then 'hello'
                            WHEN 234 then 'bye'
                            ELSE ''
                       END
                     )
                , '')
FROM table1 as t1

嗯...你的SELECT CASE语句语法不正确。你需要移除SELECT,并在CASE后(在WHEN之前)添加一个表达式,或者用布尔表达式替换你的123/234。 - Julien Blanchard
@JulienBlanchard 我更新了我的帖子。它运行良好,只是当c2的值不是数字时,隐式转换会失败。 - cool breeze
2个回答

4

有很多方法可以将 numeric 转换为 varchar,但是没有一种方法是可用的(实际上,SQLServer2008令人失望,因为它缺少一些几乎必需的很酷的功能)。

在您的情况下,最好的方法就是将数字表达式简单地转换为 varchar,如下所示:

UPDATE t1
     set c1 = CASE c2
         WHEN '123' then 'hello'
         WHEN '234' then 'bye'
         ELSE ''
     END      
FROM @t1 t1

这句话并不直接回答问题,但是可以解决你的问题。


我正在将 varchar 转换为 INT。 - cool breeze
我知道你正在尝试将varchar转换为numeric,但在SQL2008中这远非是万无一失的,因此我建议你做相反的事情,将它们作为varchar进行比较。根据你的例子,转换为numeric只是一个错误。实际上,在算术运算(+-*等)之外,很少有理由转换为numeric - Julien Blanchard

3
使用 TRY_PARSE (SQL Server 2012+):
SELECT ISNULL(TRY_PARSE(column_name AS INT),0)
FROM your_table;

实时演示


2
使用isnumeric仍然可能会导致问题,例如'-'在其看来是数字。 - James Z
看起来我没有2012,函数不存在。 - cool breeze
1
@JamesZ,这不是问题:SELECT CAST('-' AS INT); -- 0 - Lukasz Szozda
我更新了我的问题,向您展示了现在的情况。 - cool breeze
2
@lad2025的isnumeric存在缺陷,因为1.45e99是数值型的,但无法适应int类型并导致溢出。 - Julien Blanchard
2
而“£”是另一个例子。 - Martin Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接