0

SQL Serverに、次の2つの列を含むテーブルがありますQuestion_askedResponse

Response列はデータ型であり、varchar(500)列に保持されている質問に対するユーザーの応答を保持しますQuestion_asked

V_age_attr次のSQLステートメントを使用してビューを作成しました。

select 
    question_asked, cast(Response as integer) 
from 
    main_table 
where 
    question_asked = 'What is your age'

単純なSQLクエリを実行すると、期待どおりの結果が返されます。ただし、sum /groupbyクエリを使用する場合などの状況では。エラーメッセージが表示されます(実際に表示されるメッセージ):

varchar値「2011-08-1300:00:00」をデータ型intに変換するときに変換に失敗しました

テーブルでmain_tableは、質問の1つは。start_dateであるため、列Responseにはテーブルの日付値が保持されますが、作成したビューには保持されません。

ここでも、selectクエリを実行して、自分のすべての値を確認できますcast(Response as integer)。これらはすべて整数値です。

私の主な質問は、これがSQL Server 2008 R2の既知の/予想される動作であるかどうか、および/またはビューを作成する以外にこのタイプのテーブルから値のサブセットを取得する別の方法があるかどうかを誰かに教えてもらえますか?

ありがとうございました

4

3 に答える 3

3

残念ながら、フィルタリングisnumericは必ずしも機能するとは限りません。SQL は記述言語であり、手続き型言語ではありません。したがって、操作は必ずしも指定された順序で機能するわけではありません。

この場合、SQL Server はデータの読み取り時に変換を試みてからフィルターを適用します。遅すぎる。エラーがあります。

caseステートメントは、少なくとも集計関数が含まれていない場合に、評価の順序を保証する唯一のステートメントです。以下は、変換の問題を修正する必要があります。

select question_asked,
       (case when isnumeric(Response) = 1 and
                  Response not like '%.%'
             then cast(Response as int)
        end) as Response
from main_table
where question_asked = 'What is your age' 

このバージョンでは、Response の小数点もチェックされます。 ISNUMERIC小数点がある場合は 1 を返しますが、それも変換に失敗します。

于 2012-09-29T17:39:56.907 に答える
1

Martin が強調したバグを考えると、Gordon の int 解釈に限定されず、任意の数値型に適用される CASE ステートメントで元の条件を実際に使用します。ISNUMERIC よりは優れていますが、SQL Server 2012 以降では TRY_CONVERT の方が優れています。SQL Server が WHERE 句の条件解決を再利用して SELECT を支援できること、またはその逆ができることを願っています。

select 
    question_asked, case when question_asked = 'What is your age'
                         then cast(Response as integer)
                         end
from 
    main_table 
where 
    question_asked = 'What is your age'
于 2012-09-29T21:22:07.457 に答える
0

を使用してフィルタリングISNUMERIC-集計関数を台無しにしている応答として非整数データが​​存在する可能性があります。

SELECT
 question_asked,
 CASE(response AS INT)
FROM
 main_table
WHERE
 question_asked = 'What is your age'
 AND ISNUMERIC(response) = 1

編集:それでも機能しない場合は、response列に対してより積極的なタイプチェックを行う必要があるかもしれません。ここで応答を確認してください:

文字列がT-SQLの数値であるかどうかを取得する方法

于 2012-09-29T17:16:04.767 に答える