2014-03-03 85 views
0

我目前堅持將表中的三個字段連接成單個字符串。這三個字段具有不同的數據類型。Db2中的DataType轉換

Select 
    CASE COALESCE(CHAR_COLUMN,'XXX') WHEN 'XXX' 
     THEN 'CHAR_COLUMN is null' 
    else 'CHAR_COLUMN='''||CHAR_COLUMN||'''' END 
    ||' and '|| 
    CASE COALESCE(DT_COLUMN,TIMESTAMP('1980-01-01-00.00.00')) 
     WHEN TIMESTAMP('1980-01-01-00.00.00') THEN 'DT_COLUMN is null' 
    else 'DT_COLUMN='''||DT_COLUMN||'''' END 
    ||' and '|| 
    CASE COALESCE(NUM_COLUMN,111) WHEN 111 
     THEN 'NUM_COLUMN is null' 
    else 'NUM_COLUMN='''||NUM_COLUMN||'''' END 
from 
S_DATATABLE 

這個作品在DB2/AIX64 9.1.7完全正常,但不是在DB2 z/OS 10.1.5
錯誤
時當日期欄分別跑

SQL0171N The data type, length or value of the argument for the parameter in position "2" of routine "||" is incorrect. Parameter name: "||". SQLSTATE=42815  

請建議需要爲這個DB2版本做什麼樣的變化對於數字列

An unexpected token ",111" was found following ",111". Expected tokens may include: "CONCAT ||/MICROSECONDS MICROSECOND SECONDS SECOND MINUTES". SQLSTATE=42601 

分開跑。提前致謝。

+0

你確定這兩個系統上的陳述完全相同嗎?錯誤消息表明語法上的差異,例如缺少撇號。 – WarrenT

回答

4

首先,不管DB2版本串聯需要字符操作數;你不能連接一個字符串和一個整數--DB2將嘗試隱式地將非字符數據類型轉換爲字符。如果您進行明確的轉換以避免錯誤,那麼最好。其次,你的SQL似乎不必要的複雜。取而代之的

CASE COALESCE(NUM_COLUMN,111) 
    WHEN 111 
     THEN 'NUM_COLUMN is null' 
    else 'NUM_COLUMN='''||NUM_COLUMN||'''' 
END 

你可以簡單地這樣做:

CASE WHEN NUM_COLUMN IS NULL 
     THEN 'NUM_COLUMN is null' 
    ELSE 'NUM_COLUMN='||VARCHAR(NUM_COLUMN) 
END 

注意,在你原來的代碼你比較NUM_COLUMN一個字符的文本,這也將導致隱式轉換。並非所有DB2平臺都支持所有數據類型之間的隱式轉換,因此再次不要依賴它,而是使用顯式轉換。

+0

我明白你的觀點。隱式轉換在一個db2版本中工作正常,但沒有在其他[我再次嘗試確認]。現在按照你的建議,我已經改變了我的代碼,以便在需要時進行顯式轉換。它現在工作正常。謝謝。 – user2223335