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 に答える