sql >> データベース >  >> RDS >> Sqlserver

SELECTのMSSQLcast([varcharColumn] to int)は、WHERE句が不正な値を除外する前に実行されます

    まず、これは「明白な設計上の問題」ではありません。 SQLは出力の記述言語であり、処理がどのように行われるかを指定する手続き型言語ではありません。一般に、処理の順序は保証されておらず、これは利点です。設計上の問題があると言えるかもしれませんが、それはSQLステートメントでの例外の一般的な処理に関するものです。

    SQL Serverのドキュメント(http://msdn.microsoft.com/en-us/library/ms181765.aspx)によると、スカラー式のCASEステートメントの評価の順序に依存することができます。 。したがって、次のように機能するはずです。

    select (case when isnumeric(c.varcharColumn) = 1 then cast(c.varcharColumn as int) end)
    

    または、「int」式に近づけるには:

    select (case when isnumeric(c.varcharColumn) = 1 and c.varcharColumn not like '%.%' and c.varcharColumn not like '%e%'
                 then cast(c.varcharColumn as int)
            end)
    

    少なくとも、コードは明示的なCASTを実行しています。キャストが暗黙的である(そして何百もの列がある)場合、この状況ははるかに厄介です。



    1. MySQLユニオンクエリ、2つの変数による順序

    2. Railsアプリのdb/modelに営業時間をどのように保存しますか?

    3. MYSQL-日付間のタイムスタンプを取得する

    4. CakePHPHTMLqouteエンコーディングの問題