2012-01-10 16 views
4

私は、BDEテーブル(ソース)をIB Datapumpを使用してFirebirdテーブル(宛先)に変換するためにinsert文を使用しています。そのため、INSERT文にはパラメータを介してソース表の値が渡されます。ソースフィールドパラメータの1つはalphanum (SOURCECHAR10 char(10)で、ほとんどの場合整数を保持し、(整数型)宛先列NEWINTFLDで整数に変換する必要があります。​​が数値でない場合は、NEWINTFLDに0を代入します。IIFなどを使用してINSERTで整数にcharを変換する

私は、文字列が数値であるかどうかをテストし、数値でない場合は、次のように0を代入するためにIIFSIMILARを使用します。

すべての非数値文字列の場合
INSERT INTO "DEST_TABLE" (......, "NEWINTFLD",.....)   
VALUES(..., IIF(:"SOURCECHAR10" SIMILAR TO '[[:DIGIT:]]*', :"SOURCECHAR10", 0),..) 

しかし、私はまだ変換エラーを取得し(DSQL error code = -303)

は私が SOURCECHAR10" SIMILAR TO '[[:DIGIT:]]*', 1, 0)のような IIF結果フィールドに定数のみでテストされ、それはそう何とか正常に動作します:​​を IIFの真の結果フィールドにエラーが発生します。 これを回避する方法はありますか?

+0

に評価されたときに、外側のキャストが適用されて、私はこれを正しく読めば、あなたがしています値が数字で始まることをテストするだけです。あなたは数字で始まるが、後で数字以外の値を持つ値がありますか? – MatBailie

+0

はい、そうかもしれません。しかしafaik [[:DIGIT:]] *は、私がhttp://www.firebirdsql.org/file/documentation/reference_manuals/reference_material/html/langrefupd25-similar-to.htmlを見ると「任意の桁数」を意味します。 –

答えて

1

クエリが実行されると、パーサーは整数が必要な場所で:"SOURCECHAR10"の2番目の使用が使用されていることに気付きます。そのため、SOURCECHAR10の内容は、文字列が整数でない場合には使用されなくても、その位置の整数に変換されます。

実際にFirebirdは:"SOURCECHAR10"をパラメータとして使用しませんが、接続ライブラリは2つの別々のパラメータプレースホルダ?に変換し、2番目のプレースホルダのタイプはINTEGERになります。したがって、実際のクエリが実行される前に変換が行われます。これにはない

CASE 
    WHEN :"SOURCECHAR10" SIMILAR TO '[[:DIGIT:]]*' 
     THEN CAST(:"SOURCECHAR10" AS INTEGER) 
    ELSE 0 
END 

溶液(:正解のための第二の例を参照してくださいNOTE)のようなものを使用する(私は構文エラーが含まれている場合があり、それをテストしていない)おそらくこのような作業はこれで問題が解決しない場合、パラメータが正しく同定され、あなたも確認すること:"SOURCECHAR10"周りVARCHARへの明示的なキャストを追加しようとする可能性があり、CAST() item 'Casting input fields'

を参照して、パラメータ自体のキャストとして解釈されますVARCHARとしてfiedが:

ここ
CASE 
    WHEN :"SOURCECHAR10" SIMILAR TO '[[:DIGIT:]]*' 
     THEN CAST(CAST(:"SOURCECHAR10" AS VARCHAR(10) AS INTEGER) 
    ELSE 0 
END 

内側のキャストがパラメータ自体に適用した場合の式が真

+0

ありがとうたくさん。明示的なキャストで2番目のソリューションが働いた! (1番目はまだエラーを出しました) –

+0

@WilfriedVisser私は最初のものが同じ問題を抱えていると思っていましたが、わかりませんでした。第2の作品が聞こえていいです、あなたは私の答えを受け入れることができますか? –

+0

@WilfriedVisser - 最初のものが失敗した場合、INTの限界を超える値を持つことがあります。ファイアバードにはBIGINTの変種がありますか? – MatBailie

関連する問題