REPLACE只是有一个导致转换失败的数字

时间:2018-03-19 14:18:03

标签: sql sql-server

我正在尝试计算以查看列value中有多少字段是> 10:

SELECT 
    COUNT(CASE WHEN t.value > 10)
    THEN 1
    ELSE NULL
    END
FROM table t
WHERE t.DATE = '2017-01-01'

但是,该列包含一些自定义条目,例如+15>14.0,因此我添加了以下内容:

SELECT
    COUNT(CASE WHEN value LIKE '>%'
            and Replace(value, '>', '')  > 10)
FROM table t
WHERE t.DATE = '2017-01-01'

然而,在这之后,我收到以下错误:

  

转换varchar值'> 14.0&#39>时转换失败数据   输入int。警告:聚合或其他消除了空值   SET操作。

看到我无法使用UPDATE重写数据库,是否有人有解决方案?

2 个答案:

答案 0 :(得分:4)

可以解决此问题,只需将10更改为10.0

SELECT  CASE WHEN '14.0' > 10.0 THEN 1 ELSE 0 END

这会导致'14.0'隐式转换为十进制而不是int,这有效,或者您显式转换它:

SELECT CASE WHEN CONVERT(DECIMAL(14, 2), '14.0') > 10 THEN 1 ELSE 0 END

如果是我,而且我无法更新数据,并且做了一些左侧字段,例如use a numeric data type to store numbers,我会完全忽略这些值,只需使用{{3}避免转换错误:

SELECT
    COUNT(CASE WHEN TRY_CONVERT(DECIMAL(14, 2), value) > 10 THEN 1 END)

这是一个varchar专栏,所以废话可能存在的可能性是无穷无尽的,你现在可以通过替换>+来获得一个现在有效的查询,但那么当某人时呢?放入<,或以+ 14之间的空格或'aaaa'之类的完全随机的空格结束,它在哪里结束?

答案 1 :(得分:1)

查看表格和示例数据会很有帮助,但听起来你有字符串是数字和符号。

您可以将其转换为转换数据,因为您正在混合和匹配数据类型。

SELECT
    COUNT(CASE WHEN CAST(value AS VARCHAR(10)) LIKE '>%'
            and CAST(Replace(value, '>', '') AS your_num_datatype_here)  > 10)