下午好人。
我将在前面加上“这是一个很难问的问题”。当我认为我已经覆盖了那部分时,我遇到了转换错误。显然,我没有。
情况:包含INT数据的VARCHAR字段,以及导致转换问题的一些随机垃圾字符串。这是我正在尝试做的一个例子。
DECLARE @MyTABLE TABLE (
Value VARCHAR(50) NOT NULL
);
-- insert some strings
INSERT INTO @MyTABLE (Value) VALUES('400'), ('H-100'), ('H-200'), ('500'),
('600'), ('H-300');
-- conversion fails for the actual strings
SELECT *
FROM @MyTABLE m
WHERE CAST(m.Value AS INT) BETWEEN 1 AND 1000;
-- what I THOUGHT would fix it, but doesn't...
SELECT *
FROM (SELECT * FROM @MyTABLE WHERE Value NOT LIKE 'H%') X
WHERE CAST(X.Value AS INT) BETWEEN 1 AND 1000;
我意识到还有其他方法可以做到这一点,例如将所有坏的数据插入临时表并查询,但我想知道为什么我的查询不起作用以及我能做什么解决它。
编辑 - 这适用于SQL 2008 R2
提前致谢!
答案 0 :(得分:1)
这是一个奇怪的位,如果你注意到它是BETWEEN子句杀死它,因为当你认为WHERE没有被评估时,你可以使用:
SELECT *
FROM @MyTABLE
WHERE CASE WHEN ISNUMERIC(Value)=1 THEN value ELSE 0 END
BETWEEN 1 AND 1000
演示:SQL Fiddle