SQL类型转换失败仍然存在于集合之外

时间:2013-06-18 19:38:28

标签: sql type-conversion

下午好人。

我将在前面加上“这是一个很难问的问题”。当我认为我已经覆盖了那部分时,我遇到了转换错误。显然,我没有。

情况:包含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

提前致谢!

1 个答案:

答案 0 :(得分:1)

这是一个奇怪的位,如果你注意到它是BETWEEN子句杀死它,因为当你认为WHERE没有被评估时,你可以使用:

SELECT *
FROM @MyTABLE
WHERE CASE WHEN ISNUMERIC(Value)=1 THEN value ELSE 0 END
      BETWEEN 1 AND 1000

演示:SQL Fiddle