NVARCHAR
ID列とNVARCHAR
10進値のみを持つ別の2つの列を持つテーブルで作業していますが、スキーマを自由に変更することはできません。
を使用してCAST(FIELD AS DECIMAL(18,6))
、単一のIDをクエリするデータに対して必要な計算を実行できますが、2つのIDをクエリすると変換エラーが発生します。
'TEST1'と 'TEST2'の2つのIDを考えてみましょう。以下は、正常に機能します。
SELECT ID, CAST(FIELD AS DECIMAL(18,6)) AS FOO
FROM MY_TABLE
WHERE ID = 'TEST1'
これも問題なく動作します
SELECT ID, CAST(FIELD AS DECIMAL(18,6)) AS FOO
FROM MY_TABLE
WHERE ID = 'TEST2'
ただし、これによりエラーが発生します
データ型nvarcharを数値に変換中にエラーが発生しました
SELECT ID, CAST(FIELD AS DECIMAL(18,6)) AS FOO
FROM MY_TABLE
WHERE ID = 'TEST1' OR ID = 'TEST2'
これをどのように処理すればよいですか?
違いは実行パスです。最初の2つのクエリに基づいて、以下は有効な結果セットを返すはずです。
SELECT ID, CAST(FIELD AS DECIMAL(18,6)) AS FOO
FROM MY_TABLE
WHERE ID = 'TEST1' OR ID = 'TEST2';
残念ながら、何が起こっていることは、SQL Serverは、全表スキャンを実行することを決定していることであるとプッシュcast()
近いデータへ。またはFIELD
以外の値が問題を引き起こしています。'TEST1'
'TEST2'
これはバグだと思います。私の意見に関係なく、SQL Server2012 +には簡単な修正があります。
SELECT ID, TRY_CAST(FIELD AS DECIMAL(18, 6)) AS FOO
FROM MY_TABLE
WHERE ID = 'TEST1' OR ID = 'TEST2';
SQL Server 2008(まもなくサポートされなくなります)では、次のCASE
式を使用できます。
SELECT ID,
(CASE WHEN FIELD NOT LIKE '%[^0-9.]%' AND
FIELD NOT LIKE '%.%.%'
THEN CAST(FIELD AS DECIMAL(18, 6))
END) AS FOO
FROM MY_TABLE
WHERE ID = 'TEST1' OR ID = 'TEST2';
失敗する代わりに、これはを返しますがNULL
、これは単に無視されます。また、のID IN ('TEST1', 'TEST2')
代わりにを使用する必要がありますOR
が、それはあなたの質問とは無関係です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加