1

data type の列がありvarchar、その中には数値 (10 進数) の値が含まれています。数値が 100 を超えるすべての行を検索する必要があります。数値を含む行をフィルター処理するために使用しています。その後、数値を使用または値に変更ISNUMERICしようとしています。サブクエリを使用すると問題が解決するという別の提案を読みましたが、それも試してみましたが、うまくいきませんでしたCASTCONVERTdecimal

これは私が受け取っているエラーメッセージです:

varchar をデータ型数値に変換中に算術オーバーフロー エラーが発生しました。

コード:

select field_name
from table_name
where ISNUMERIC(field_name) = 1  and
      field_name in (select cast(field_name as decimal)
                     from table_name
                     where ISNUMERIC(field_name) = 1
                       and field_name not like '%,%'
                       and field_name not like '%-%'
                       and field_name != '.'
                       and field_name > 100.00)
4

2 に答える 2

1

これはあなたのクエリです:

select field_name
from table_name
where ISNUMERIC(field_name) = 1  and
      field_name in (select cast(field_name as decimal)
                     from table_name
                     where ISNUMERIC(field_name) = 1 and
                          field_name not like '%,%' and
                          field_name not like '%-%' and
                          field_name <> '.' and
                          field_name > 100
                    )

where節が の前にフィルタリングされていると仮定していselectます。本当じゃない。実際、SQL Servercast()は、データを読み取る操作に をプッシュします。その後、フィルターを適用します。

実際、サブクエリと共通テーブル式も評価の順序を保証しません。何が行われるかcase(少なくともこの場合、集計は含まれません)。したがって、クエリを次のように記述できます。

select field_name
from table_name
where (case when ISNUMERIC(field_name) = 1 and
                 field_name not like '%,%' and
                 field_name not like '%-%' and
                 field_name <> '.'
            then cast(field_name as decimal)
       end) > 100;

サブクエリの理由がわかりません。

于 2015-01-31T22:59:08.197 に答える