LoginSignup
2
6

More than 1 year has passed since last update.

OracleのSQLをPostgeSQLのSQLにしてみる時に役立てたいリンク集

Last updated at Posted at 2018-08-29

image.png

そもそもOracleをあんまり使ったことがない

今現在を表したい

-- Oracle
SYSDATE;
SYSTIMESTAMP;

-- PostgreSQL
CURRENT_DATE;
CURRENT_TIMESTAMP;

/*
 * SYSDATE >> current_date
 */
-- Oracle
select sysdate from dual;
-- PostgreSQL
select current_date;

文字列を結合したい(連結演算子というもの)

-- Oracle:連結演算子
SELECT 'Name is ' || last_name FROM employees ORDER BY last_name;

-- PostgreSQL:連結演算子というかは不明だが同じものがある
SELECT 'Name is ' || last_name FROM employees ORDER BY last_name;

関数

/*
 * DECODE >>> CASE
 */
-- Oracle
DECODE('判定する値', 1, '1だった時の値', 2, '2だった時の値', '1でも2でもない場合')

-- Postgresql:DECODE関数は違う意味の関数としてPostgeSQLにもあるので注意
CASE '判定する値' WHEN 1 THEN '1だった時の値' WHEN 2 THEN '2だった時の値' ELSE '1でも2でもない場合' END

/*
 * NVL >>> COALESCE
 */
-- Oracle
NVL('nullかもしれない値', 'nullだった時の値')
NVL2('nullかもしれない値', 'nullじゃなかった時の値', 'nullだった時の値')

-- Postgresql
COALESCE('nullかもしれない値', 'nullだった時の値')

明示的な行ロック

/*
 * PstgreSQL
 */
-- トランザクションが終わるまで、他のトランザクションがロック、変更、削除できない
SELECT  WHERE ... FOR UPDATE;
-- 同じ行のロックを獲得しようとするSELECT FOR KEY SHAREコマンドをブロックしないFOR UPDATE
SELECT  WHERE ... FOR NO KEY UPDATE;
-- 排他ロックではなく共有ロックを獲得する
SELECT  WHERE ... FOR SHARE;
-- SELECT FOR UPDATEはブロックされるが、SELECT FOR NO KEY UPDATEはブロックされないFOR SHARE
SELECT  WHERE ... FOR KEY SHARE;

/*
 * Oracle
 */
-- SELECT対象の全ての表のレコードをロック
SELECT  WHERE ... FOR UPDATE;
-- 表を結合する場合に使用。行ロックする表を指定
SELECT  WHERE ... FOR UPDATE OF 行ロックする表.列名 [,column_name2...];
-- 対象レコードにロックがかかっていた時に、ロックが開放されるまで待つ
SELECT  WHERE ... FOR UPDATE WAIT [待ち時間]
-- 対象レコードにロックがかかっていた時に、開放を待たずに下記エラーで復帰
SELECT  WHERE ... FOR UPDATE NOWAIT;
2
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
6