2012-01-10 22 views
4

我正在使用insert語句將BDE表(源)轉換爲使用IB數據轉換的Firebird表(目標)。所以INSERT語句通過參數來源表值。其中一個源字段參數爲alphanum (SOURCECHAR10 char(10),主要包含整數,需要在(整數類型)目標列NEWINTFLD中轉換爲整數。如果​​不是數字,我想將0分配給NEWINTFLD使用IIF在INSERT中將char轉換爲整數似乎到

我用IIFSIMILAR來測試該字符串是否是數字,如果不是數字如下分配0:

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 2012-01-10 13:31:36

+0

是的,可以。但是afaik [[:DIGIT:]] *表示如果我查看http://www.firebirdsql.org/file/documentation/reference_manuals/reference_material/html/langrefupd25-similar-to.html – 2012-01-10 13:39:49

回答

1

當你的查詢被執行時,解析器會注意到第二次使用:"SOURCECHAR10"被用在需要整數的地方。因此,它總是會將SOURCECHAR10的內容轉換爲該位置的整數,即使該字符串不是整數時也不會被使用。

在現實中,Firebird不使用:"SOURCECHAR10"作爲參數,但是您的連接庫將其轉換爲兩個單獨的參數佔位符?,第二個佔位符的類型將爲INTEGER。所以轉換髮生在實際查詢執行之前。

的解決方案可能是(我沒有測試它,可能包含語法錯誤)使用類似(注意:看到正確的解決方案第二個例子):

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

這不工作,因爲這被解釋爲參數本身的演員,看CAST() item 'Casting input fields'

如果這也不行,你也可以嘗試添加一個顯式類型轉換爲VARCHAR各地:"SOURCECHAR10"以確保該參數是正確identi田間爲VARCHAR:

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

這裏內投應用於參數本身,當CASE表達式被真正

+0

感謝您的任意位數很多。明確演員的第二個解決方案工作! (第一個仍然給出了錯誤) – 2012-01-10 13:50:22

+0

@WilfriedVisser我懷疑第一個會有同樣的問題,但不確定。很高興聽到第二個人的作品,你能接受我的答案嗎? – 2012-01-10 13:58:10

+0

@WilfriedVisser - 如果第一個失敗,您的值可能超過INT的限制。 firebird是否有可以使用的BIGINT變體? – MatBailie 2012-01-10 14:16:59