- はじめに
- OracleとPostgresの違い
- Oracle⇒Postgresの主な変更点
- 各種リンク
- 出典元サイト
はじめに
業務でOracleからPostgresにDBを変更することになり、その際の疑問や頂いたメモをまとめてみました。
OracleSQLとPostgresSQLの違い(大まか)
- Postgresはオープンソースのデータベースソフトウェアであり、全てのソースが公開されているため、無料で利用可能
- ソフトウェアのライセンスの1つであるBSDライセンス🔗を採用しているため、独自に機能の追加や改良を行っても公開義務は生じない
- PostgresSQLはMySQL(こちらも現在はOracle社が管理しています、ややこしいですね)同様、派生されたデータベースソフトウェアが多数あり
PostgreSQL⇒EDB PostgreSQL・PowerGressなど
MySQL⇒Maria DB・Amazon Aurora
Oracle⇒Postgresの主な変更点
(※以下の文に登場する@@@は情報漏れ防止の隠し文字です)
-
空文字
Oracle:NULLとして扱われるため、NVL(NVL2)で、条件が成立
PosrgreSQL:区別されるため単純なSQL関数の置きかけでは問題が生じるケースがあり -
文字列の連結(連結対象のフィールドがNULLの場合)
Oracle:空文字とみなして連結される
PostgreSQL:NULL
例:M. Name || '(' || M.NickName || ')'
↳ NameまたはNicknameがNULLなら結果はNULL -
CONCATメソッド
NULLを空文字として連結するので、CONCAT(M. Name, '(', M.NickName, ')')に修正 -
暗黙の型変換
Oracle:有効
PosrgreSQL:厳密な型チェックが行われ適合しない場合にはSQL実行エラー
↳PosgreSQLでTO_XXXXXX関数で型変換する際は、必ず書式(フォーマット)を指定する必要あり -
TO_CHAR関数(※小数点ありの数値)
文字変換する場合は、整数値でも必ず小数点が付く
例:to_char(10.0, 'FM99.9’) → 10.
回避するために、pkgCom.NUM_TO_CHAR()関数を作成 -
LENGTHB関数、SUBSTRB関数
PostgresSQLでは用意されていない為、@@@.LENGTHBおよび @@@.LEFTB関数を作成
(現在のところ、SUBSTRBは1から開始するものしか存在しないためLEFTBのみの実装) -
INSTR関数
PostgresSQLでは用意されていない為、@@@.INSTR関数を作成しております。 -
LAST_DAY関数
PostgresSQLでは用意されていない為、@@@.LAST_DAY関数を作成しております。 -
TO_XXXX関数
PostgresSQLでは同じ型への変換は、エラーになるためTO_XXXXXメソッドを取り除く。 -
全角->半角
Oracle版から移行したTOSINGLEBYTE関数で変換可能 -
半角->全角
変換できないためpkgCom.TO_MULTI_BYTEを作成 -
SELECT DISTINCT
PostgreSQLの場合Order By で指定した列をSELECT句に含める必要あり
// Oracle
Select Distinct PatientId From tbl@@@ Order By to_number(@@@Id)
// Postgres
Select Distinct PatientId , to_number(PatientId, '999999999') From tbl@@@ Order By to_number(@@@Id, '9999999999')
- 和暦変換
・PostgreSQLではサポートされていないため、PPOS.ConvertDate関数を作成して対応 - 「(*)」を使用した外部結合
・Oracle独自の機能の為LEFT JOINに変更
各種リンク
日本Postgresユーザ会🔗
Oracle公式の学習サイト🔗
データベースのトレンドランキング🔗