2017-05-24 12 views
1

varcharフィールドを10進数に変換するCTEクエリがあります。 しかし、CTE後のSELECTでは、返される値を制限したいと思います。私はSQL算術オーバーフローエラーwhere句の値を制限するときにvarcharを10進数に変換するエラー

arthimeticオーバーフローエラー

を得るとき これはこれは、クエリです:

;WITH CTE 
AS 
(
SELECT PP.PatientProfileID, 
     ROUND(CAST(CASE WHEN ISNUMERIC(O.Value) = 1 THEN O.Value END AS DECIMAL(4, 1)), 1) AS BmiValue 
FROM PatientProfile PP RIGHT OUTER JOIN Encounter E1 ON PP.PatientProfileID = E1.PatientProfileID 
     JOIN Procedures P on E1.PatientEncounterID = P.PatientEncounterID 
     JOIN Observation O ON O.PatientProfileID = E1.PatientProfileID 
WHERE P.CPTCode = '3008F' AND 
    O.Term = 'BMI' AND O.Value IS NOT NULL 
) 
SELECT * 
FROM CTE 
WHERE BmiValue >= 18.5 AND BmiValue < 25.0 

私はちょうどにwhere句制限:WHERE BmiValue >= 18.5誤りがないし。 WHERE BmiValue < 25.0のみを使用するとエラーは発生しません。 両方の式を使用する場合のみ、算術オーバーフローエラーが発生します。

クエリに問題がありますか?

更新 私のコメントで述べたように、私はSQL Server 2008 R2を使用しています。 10進値のCTEのヌルを除去します。 WHERE句を削除すると、BmiValueのすべての値が10進値として表示されます。

私はこのWHERE句にBmiValuesの選択を狭める場合: WHERE (BmiValue >= 18.5) AND (BmiValue < 30.0) 何の算術オーバーフローエラーがありません。 最大値をこれに変更すると、次のようになります。 WHERE (BmiValue >= 18.5) AND (BmiValue < 29.0) 算術オーバーフローエラー...異常です。

+1

どのバージョンのSQL Serverを使用していますか? – SqlZim

+1

これは "P"というエイリアスを持つ2つのテーブルでどのように動作しますか? –

+1

@JacobHデータベースが大文字と小文字を区別する照合を使用している場合、それらは実際は異なる別名です。 –

答えて

3

これはオーバーフローエラーであるため、decimal()のサイズを増やすことができます。しかし、cast()に別の問題はありません。

SQL Server 2012の、最大で
;with CTE as (
    select PP.PatientProfileID 
    , ROUND(CAST(case when ISNUMERIC(O.Value) = 1 then O.Value end as decimal(19, 6)), 1) as BmiValue 
    from PatientProfile PP 
    right join Encounter E1 on PP.PatientProfileID = E1.PatientProfileID 
    inner join Procedures p on E1.PatientEncounterID = p.PatientEncounterID 
    inner join Observation O on O.PatientProfileID = E1.PatientProfileID 
    where p.CPTCode = '3008F' and O.Term = 'BMI' and O.Value is not null 
) 
select * 
from CTE 
where BmiValue >= 18.5 and BmiValue < 25.0 

:変換ではなく、エラーの失敗したときに、これらのそれぞれは、nullを返します。

+0

この回答は使用できません。私はSQL Server 2008 R2のです –

+0

小数点以下桁数を増やすと問題が解決しました!本当にありがとう。 –

+0

@GloriaSantin助けて嬉しいです! – SqlZim

1

おそらく、NULL値に数学を実行しようとしています。

1)ISNUMERIC()は、数値だけではなく( ' - '、 '+'、 '$'など)、trueを返します。代わりにTRY_CAST()を使用してください。

2)CASE文にはELSE句が必要です。そうでない場合は、CASTのいずれかのISNUMERIC() = false(つまりヌル値)をDECIMALにしようとしています。

それ以外では、where句にBETWEENを使用してください。ちょうどクリーナーです。

+0

'null'はオーバーフローエラーを引き起こさず、' between'アドバイスは私にとっては悪い考えです。 [悪魔との間には何が共通していますか? - Aaron Bertrand](http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx) – SqlZim

+0

私は 'nullを削除します'CTE'の値...' O.Value IS NOT NULL' –

関連する問題