2011-12-22 4 views
3

キャスト:10YR3/6 T-SQL確定INTは、所与

  • 行2:

    • SQL Serverの
    • 表はタイプVARCHAR(50) NOT NULL
    • 行1のTEST_FIELDと呼ばTEST_TABLETEST_TABLE
    • 列と呼ばれます:10YR3/2
    • クエリ:SELECT TEST_FIELD FROM TEST_TABLE WHERE ...

    質問:私は、文字列の最後の文字の値をテストする必要が私のところ条件で

    。私は、Where節で次のことを実行するのと同じ動作に気付きます。ケース1で

    1. RIGHT(TEST_FIELD,1) > 3
    2. CAST(RIGHT(TEST_FIELD,1) AS INT) > 3

    彼らはいくつかの推論されたキャストを通じて同じ行動をしていますか?ケース1は決定的ですか?

    ありがとうございます。あなたは、インスタンスの値をチェックするとき

    マット

  • 答えて

    2

    変換が行われます:SQLがエラーをスローせずに整数にA2を変換することはできませんので

    DECLARE @t varchar(100) 
    
    SET @t = (SELECT 'ABCA2') 
    
    SELECT @t  
    
    IF RIGHT(@t, 2) > 10 
        SELECT 'Hi' 
    ELSE 
        SELECT 'Bye' 
    

    はエラーをスローします。

    しかしあなたが@tを交換する場合:変換が成功したとの比較を行うことができるよう

    SET @t = (SELECT 'ABC12')

    を上記のコードは動作します。正しい関数自体はあなたの価値を変換しません。 MSDNには、明示的にRIGHT()の戻り値の型を述べている:

    返しvarchar型をcharacter_expressionには、非Unicode文字 データ型である場合。

    character_expressionがUnicode文字データの場合は、nvarcharを返します。 タイプです。

    の比較は、例えば、テキストで行われたときに、完全に機能RIGHT()を排除し、自分自身にそれを容易にするために:私はRight()への呼び出しをしなかった

    DECLARE @t varchar(100) 
    
    SET @t = (SELECT '1') 
    
    SELECT @t 
    
    IF @t < 10 
        SELECT 'Hi' 
    ELSE 
        SELECT 'Bye' 
    

    お知らせ。上記の結果は、1の表示、次にテキストの表示です。

    +0

    私の場合、私は値自体にいくつかのユニークな値を持っています。 10YR3/6。 10、3、および6を使用しないでください。 1036? 3または6の代わりに10を悪化させるか?私の質問がこれを念頭に置いて続けられるように、その行動についてはわかりません。 –

    +0

    @MattAkers - 値を解析してそれぞれ10,3、そして6を得ることができればOKです。そうでない場合は、テキストと整数データ型の比較が例外をスローします。 10YR3/6と100の値を比較することはできません。操作の実行方法はわかりませんが、これはRight()またはLeft()とは何の関係もありません。比較終わらせる。これは理にかなっていますか? – JonH

    +0

    それは完璧な意味合いがあります。私はあなたの例とコメントに完全に同意します。私の質問は、比較コンバージョンが合格/不合格になるタイミングとその理由は次のとおりです.1と2の部分が同じように動作するのはなぜですか?1がブラックボックスでキャストされているように見える場合、本当にキャストする必要がありますか?そして、第1節は決定論的な振る舞いをしていますか? –

    0

    ケース1は確定的です。文字列から整数への暗黙の変換(2つの整数の比較と終了の比較)または例外のスローが可能です。

    +0

    ありがとうBako。それが私が探していたものです。乾杯! –