2016-09-28 3 views
0

私は次のクエリを使用して「パンチにわたり署名」に反するためにクエリを記述しようとしています:署名付きオーバーパンチを使用しているときに、私のcase文が計算に使用できないのはなぜですか?

SELECT 
CASE when substring(MyField,16,1)='C' then cast(substring(MyField,9,7)+'0' AS decimal(20,2)*-1 FROM MyTable 

ここではいくつかのサンプルデータがあります:

[email protected]@ 

上記のデータから、位置が開始7

の長さの1 の長さと位置9(0)で、他の開始と(「C」)16時しかし、私はこのエラーを取得しておいてください。

Msg 102, Level 15, State 1, Line 139 
Incorrect syntax near '*'. 

所望の出力: 00000063(C = 3)

私が間違って何をしているのですか?

パンチの上に署名するための参照用に、このページをご参照ください:

https://en.wikipedia.org/wiki/Signed_overpunch

+3

あなたは '* -1'を持っていますか?代わりに平均 ')-1'? – jarlh

+0

[case expression](https://msdn.microsoft.com/en-gb/library/ms181765.aspx)に「END」がありません。 –

答えて

3

あなたはおよそoperator precedenceを学ぶ必要があります。このコード:それは

[..snip..] then cast(...) AS (decimal(20,2) * -1) 
           ^------------------^ 

を書かれていたかのように

[..snip..] then cast(substring(MyField,9,7)+'0' AS decimal(20,2)*-1 

が実行されているあなたはmultiplicableされていない、あなたがdecimal(20,2)をmutiplyしようとしている、キャストの結果を乗算していません値。

ではなく

then (cast(substring(MyField,9,7)+'0' AS decimal(20,2)) * -1 
    ^------------------------------------------------^ 

を試してみてください。

0

これが修正されるかどうかはわかりませんが、閉じ括弧がありません。あなたはまた、これらの問題を見つけるのをより簡単にするために、このようなものをインデントすることをお勧めします。

SELECT CASE 
    WHEN substring(MyField,16,1)='C' 
     THEN cast(substring(MyField,9,7)+'0' AS decimal(20,2))*-1 
    END 
FROM MyTable 
0

はそうしてみてください:

SELECT CASE when substring(MyField,16,1)='C' then cast(substring(MyField,9,7)+'0' AS decimal(20,2)) *-1 end FROM MyTable 

問題はなかった行方不明 ")" defore "* -1" と行方不明 "終了" 状態の場合を終了する時。

これらの2つの例では、 '0000069A0000006C00000000 @ 0000000 @'の結果は-60.00です。

関連する問題