我正在尝试计算以查看列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
重写数据库,是否有人有解决方案?
答案 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)