【问题标题】:How to cast varchar to int in sql如何在sql中将varchar转换为int
【发布时间】:2012-06-26 11:35:04
【问题描述】:

我有一个名为ExamInfo 的表。在该表中,列Sub1 的类型为VARCHAR(50)。 Sub1 列包含 numericnullnon-numeric 数据。

我想从ExamInfo中选择Sub1中数据大于81的地方。

这是我的查询:

select * 
from Exam 
where cast(sub1 as int) > 81`.

但它无法转换导致错误。

【问题讨论】:

  • 您能指定您在哪个数据库服务器上运行吗?
  • 什么你得到的错误是什么?我们看不到您的屏幕 - 我们无法读懂您的想法 - 您需要告诉我们!

标签: asp.net sql sql-server-2000


【解决方案1】:

看起来 sub1 中的某些数据无法转换为 int。检查非数字数据的数据。

【讨论】:

    【解决方案2】:

    由于您的列包含混合信息并且转换应用于整个列,因此您需要确保仅尝试转换实际数值:

    select * 
    from Exam 
    where case when ISNUMERIC(sub1) =1
                and CHARINDEX('.', sub1) = 0 
                and sub1 >= -2147483648 
                and sub1 <= 2147483647
               then cast(sub1 as int) 
               else 0 
          end > 81
    

    这是一个关于如何在 SQL Server 中执行此操作的示例。

    这个查询还有一个注意点,那就是“全球化”。这 '。'我们正在检查,因为小数点并非到处都用作小数点。如果您有本地化的 SQL Server,您可以通过

    获取正确的小数分隔符
    DECLARE @decimal_separator char(1)
    set @decimal_separator = SUBSTRING(CONVERT(CHAR(3), CONVERT(NUMERIC(2,1), 1.0/2)), 2, 1)
    

    这会将查询变成:

    DECLARE @decimal_separator char(1)
    set @decimal_separator = SUBSTRING(CONVERT(CHAR(3), CONVERT(NUMERIC(2,1), 1.0/2)), 2, 1)
    
    select * 
    from Exam 
    where case when ISNUMERIC(sub1) =1
                and CHARINDEX(@decimal_separator, sub1) = 0 
                and sub1 >= -2147483648 
                and sub1 <= 2147483647
               then cast(sub1 as int) 
               else 0 
          end > 81
    

    【讨论】:

    • ISNUMERIC 不返回布尔值。需要测试是否为1。即使这样,它也不能保证它会成功转换为int
    • 我收到错误。错误是关键字附近的语法不正确。
    • 它确实不会测试它是否是一个int。 (并修复了语法错误)
    • 我添加了对整数值的更多检查,以及有关如何处理本地化 SQL Server 的更多细节。
    • 感谢 Filip De Vos。它工作正常。我的表格中没有小数部分。所以我删除了该代码。
    【解决方案3】:

    试试这个:

     SELECT * FROM ExamInfo
     WHERE  CAST( (CASE 
                    WHEN ISNUMERIC(Sub1) <> 1 
                        THEN NULL
                    --Ignore any decimal value
                    WHEN ISNUMERIC(Sub1 + '.0e0') <> 1                  
                        THEN NULL
                    WHEN CAST(Sub1 AS NUMERIC(38, 0)) BETWEEN -2147483648 AND 2147483647
                        THEN Sub1       
                    ELSE null 
                  END) AS INT ) > 81;
    

    【讨论】:

      猜你喜欢
      • 2014-07-24
      • 2013-11-27
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      相关资源
      最近更新 更多