1

まず、さまざまな同様の投稿を読みましたが、他の投稿者がこのエラー メッセージで抱えていた問題と私が遭遇した状況との類似点を特定できませんでした。おそらく私は正しく検索していませんが、シナリオは次のとおりです。数値に変換すると 70 未満のテーブル内の値を検索しようとしています。コンマを使用して値を格納できる場合があるため (3,080 など)、コンマを削除する replace ステートメントがあります。obsValue以下のクエリの列はvarchar(2000)、それと関係があるかもしれないと推測しています。私の最初のクエリは機能しました:

Select name, obsValue
From database.dbo.table
Where name in ('LDL') 
and isnumeric(obsvalue) = 1 
and cast(replace(obsvalue,',','') as decimal(18)) < 70

nameこれにより期待値が返されますが、検索しようとしているのはそれだけではありません。その他の例としては、 があります('LDL(CALC)')。ステートメントを使用するUNIONと、クエリを結合できますが、残念ながら、アプリケーション コードを制御できないため、これはオプションではありません。私が利用できる唯一のオプションは句を使用することです。そのため、さまざまな値INを検索すると、最終的にクエリは次のようになります。name

Select name, obsValue
From database.dbo.table
Where name in ('LDL', 'LDL(CALC)') 
and isnumeric(obsvalue) = 1 
and cast(replace(obsvalue,',','') as decimal(18)) < 70

残念ながら、このようにすると、エラーメッセージが表示されます。これが他の場所ですでに回答されている場合は申し訳ありません。リンクしてください。クレジットが必要な場合はクレジットを付与します。

4

3 に答える 3

1

問題は、IN句に複数の項目がある場合、SQLServerがクエリを異なる方法で最適化することです。CASEステートメントを使用して最適化を防ぐことができます

SELECT name, obsvalue
FROM database.dbo.table 
WHERE (CASE WHEN ( isnumeric(obsvalue) = 1 
             AND name in ('LDL', 'LDL(CALC)')) 
       THEN cast(replace(obsvalue,',','') as decimal(18))
       ELSE null END) < 70
于 2012-01-30T17:45:34.803 に答える
1

IsNumeric(obsvalue) を (isnumeric(obsvalue) = 1 の obsvalue を選択) に置き換えることができます。

Select name, obsValue
From database.dbo.table
Where name in ('LDL', 'LDL(CALC)') 
and isnumeric(obsvalue) = 1 
and cast(replace((select obsvalue where isnumeric(obsvalue) = 1),',','') as decimal(18)) < 70
于 2012-01-31T01:25:28.373 に答える
1

キャスト(10進数として)関数には大きすぎる値がobsvalueにある場合がありますが、in()基準を満たしていないため、とにかく気にしません。

実際に変換する必要がある obsvalues にクエリを制限して、サブクエリに cast() を適用してみてください。

また、コンマは値が 999 より大きい場合にのみ存在し、70 未満の値をテストしているため、置換は必要ありません。実際、コンマが高すぎることがわかっているため、コンマを含む行を除外できます。

于 2012-01-30T16:51:17.573 に答える