0

各位下午好。

我将用“这是一个很难问的问题”作为开头。当我认为我已经涵盖了那部分时,我遇到了转换错误。显然,我没有。

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

提前致谢!

4

1 回答 1

1

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

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

演示:SQL 小提琴

于 2013-06-18T19:52:19.437 回答