天天看點

《卸甲筆記》-PostgreSQL和Oracle的SQL差異分析之五:函數的差異(一)

postgresql是世界上功能最強大的開源資料庫,在國内得到了越來越多機構和開發者的青睐和應用。随着postgresql的應用越來越廣泛,oracle向postgresql資料庫的資料遷移需求也越來越多。資料庫之間資料遷移的時候,首先是遷移資料,然後就是sql、存儲過程、序列等程式中不同的資料庫中資料的使用方式的轉換。下面根據自己的了解和測試,寫了一些sql以及資料庫對象轉換方面的文章,不足之處,尚請多多指教。

oracle的null判斷函數是 nvl(a, b) 和 coalesce 兩個函數。nvl(a, b) 是判斷如果a不為null,則傳回a, 否則傳回b。參數需要是相同類型的,或者可以自動轉換成相同類型的, 否則需要顯式轉換。而 coalese 參數可以有多個,傳回第一個不為null的參數。而參數必須為相同類型的 ,不會自動轉換。

postgresql中沒有nvl函數。但是有coalesce函數。用法和oracle的一樣。可以使用coalesce來轉換oracle的nvl和coalesce。參數需要使用相同類型,或者可以轉換成相同類型的。否則需要手動轉換。

oracle的字元串連接配接符(||) 和 postgresql的字元串連接配接符(||)的用法基本相同,不同的地方是

1、當連接配接的參數有null的時候,oracle中,null 的連接配接效果類似于空字元串(''),而postgresql中, 連接配接的參數中有null的, 連接配接結果統一都是null。

2、當幾個參數都是數字的時候,oracle會自動把數字轉換為字元串。這個和oracle内部的自動類型轉換有關系。而postgresql中,幾個參數中至少有一個應該為字元串,否則會報錯。

資料遷移的時候,對于oracle的 a || b 可以使用postgresql的coalesce( a, '') || coalesce( b, '')形式來轉換。

oracle的concat函數類似于字元串連接配接符(||),但隻能夠連接配接兩個參數。參數需要是字元串類型,或者可以自動轉換成字元串類型。

postgresql中也内置了這個方法。

需要注意的是,oracle的concat,如果兩個參數都是null, 則結果是null。而postgresql中,如果兩個參數都是null,則 結果是空字元串('')。因為postgresql的concat方法内部對于參數做了coalesce(null, '')處理。