【问题标题】:Conversion failed when converting the varchar value 'x' to data type int将 varchar 值“x”转换为数据类型 int 时转换失败
【发布时间】:2019-08-29 20:02:30
【问题描述】:

我有一个WHERE 条件,它适用于 STRING 类型,但适用于 INT 类型

 isnull(emp.name, 'x') <> isnull(mst.name, 'x')  -- works

但是下面的这种情况会引发错误:

 isnull(emp.age, 'x') <> isnull(mst.age, 'x')   -- fails

将 varchar 值“x”转换为数据类型 int 时转换失败。

其中 name 是 STRING,age 是 INT 类型。

如何解决这个问题?

【问题讨论】:

    标签: sql sql-server null isnull


    【解决方案1】:

    请勿将isnull() 用于此目的——甚至coalesce()。只需展开逻辑:

    where (emp.age = mst.age or emp.age is null and mst.age is null)
    

    可以输入一个假值并使用coalesce(),但类型需要一致。但是,我认为您最好使用明确的逻辑来满足您的需求并适用于所有数据类型。

    【讨论】:

      【解决方案2】:

      ISNULL 将尝试将第二个参数的数据类型转换为第一个参数的数据类型。字符串 x 无法转换为 int(假设 age 为 int)。理想情况下,使用数据中不存在的整数值:

      isnull(emp.age, -1) <> isnull(mst.age, -1)
      

      【讨论】:

        【解决方案3】:

        请注意,在您的代码中,'x' 将被视为与NULL 相同,这不太可能是您想要的。修复 age 的错误不会更正该问题。

        考虑改用运算符IS DISTINCT FROM,它类似于&lt;&gt;,但将NULL 视为“已知值”(例如NULL IS DISTINCT FROM NULL = FALSE)。

        emp.name IS DISTINCT FROM mst.name
        emp.age IS DISTINCT FROM mst.age
        

        如果您的数据库引擎不支持IS DISTINCT FROM,那么这个相关问题会很有帮助:How to rewrite IS DISTINCT FROM and IS NOT DISTINCT FROM?

        【讨论】:

        • OP 正在使用&lt;&gt;。你需要更长的逻辑。
        猜你喜欢
        • 1970-01-01
        • 2011-12-01
        • 2012-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多