0

これが私のSQLです

SELECT * FROM Answers
WHERE QuesID = 1 AND OptionID IN (2,5) AND CONVERT(float, ISNULL(AnswerValue, 0)) < 300

問題は、OptionID = 6の文字列であるレガシーデータがあることです。上記のクエリを実行すると、次のようになります。

データ型varcharをfloatに変換中にエラーが発生しました。

QuesID = 1のすべてのデータを確認し、OptionId IN(2,5)はすべてfloatデータです。SQLが最初にこのSQLの計算部分を実行しているようですが、AnswerValue比較を実行する前にOptionIDをチェックさせる方法はありますか?それとも私は完全にベースから外れていますか?

4

5 に答える 5

3

SQLが句内の句を「解決」する順序を実際に制御することはできませんWHERE。簡単なテストを行いましたが、QuesId = 3に対してのみ文字列値が入力されていれば、機能しました。

だから、はい、私がこれを書いている間にあなたが投稿したように、

AND isnumeric(AnswerValue) = 1

SQLはプロセスの早い段階で評価しているように見えるため、これを処理します。

于 2012-05-14T13:58:08.663 に答える
1

それを理解したので、SQLにISNUMERICを追加したところ、それが整理されました。

于 2012-05-14T13:56:30.397 に答える
1

式は、検索された条件が一致するCASE場合にのみ結果式を評価するため、次のことを試してください。

SELECT * FROM Answers
WHERE
    CASE WHEN QuesID = 1 AND OptionID IN (2,5) THEN
        CONVERT(float, ISNULL(AnswerValue, 0))
    ELSE
        500
    END < 300

より複雑な式の場合は、ネストされたCASE式を使用してより多くのロジックを実行することを選択できます。多くの場合、これにより、すべての条件を表現し、結果を0または1に等しくして、次のように最終的な外部比較を実行し1ます。

WHERE
1 = CASE WHEN <Condition 1> THEN
        CASE WHEN <Condition 1, Subcondition 1> THEN 0
             WHEN <Condition 1, Subcondition 2> THEN 1
        END
         WHEN <Condition 2> THEN
        CASE WHEN <Condition 2, Subcondition 1> THEN 1
             WHEN <Condition 2, Subcondition 2> THEN 0
        END
    END

の2つのサブ条件は、がtrueのCondition 1場合にのみ評価されCondition 1ます(同様にCondition 2

于 2012-05-14T14:14:23.793 に答える
0

操作の順序を保証する必要があり、パフォーマンスがそれほど重要ではない場合は、最初の2つの条件の結果を格納するテーブル変数を宣言してから、最後の条件で一時テーブルをフィルター処理できます。例えば

declare @tempAnswers table (quesID int, optionid int, answervalue varchar(50))

insert into @tempAnswers
select * 
from Answers
where QuesID = 1 and OptionID in (2,5) 

select * from @tempAnswers
where convert(float, isnull(AnswerValue, 0)) < 300
于 2012-05-14T14:46:16.177 に答える
0

SQL Server 2012にアップグレードする場合は、TRY_CONVERTを使用できます。独自仕様ですが、問題は解決します。

SELECT * FROM Answers
WHERE QuesID = 1
AND TRY_CONVERT(int,OptionID) IN (2,5)
AND CONVERT(float, ISNULL(AnswerValue, 0)) < 300
于 2012-05-14T14:55:49.527 に答える