06 DML
エスケープ
VALUES (E'55271', E'2', E'1', E'2019-10-16 11:58:44');
文字列中にエスケープが必要な場合は、E'...' の形式の文字列 (先頭に E) を使わなければなりません。
E のつかない文字列は、バックスラッシュは単にバックスラッシュ1文字として扱われます。また、シングルクォートは2つ重ねて '' とエスケープします。
insert
INSERT INTO table01 (title, body) VALUES ('title1','body001');
INSERT INTO table01 (title, body) VALUES
('title3','body003')
,('title4','body004')
,('title5','body005')
;
limit
(スコア上位3件)
select * from table01 order by score limit3;
SELECT
*
FROM
table01
WHERE true
ORDER BY
title LIMIT 3
;
case
SELECT
id
,email
,is_admin
,CASE
WHEN is_admin='0' then '管理者'
WHEN is_admin='1' then '一般'
ELSE ' '
END AS user_type
FROM
users
offset
select * from table01 order by title limit 3 offset 3;
※ 1件目から開始させる場合、offset は 0
concat
substring
ランダム
select ramdom()
無作為に抽出
select * from table01 order by random() limit 1;
キャスト(文字列・日付)
SELECT
user_id AS num_user_id
,CAST(user_id AS VARCHAR) AS user_id
,CAST(NOW() AS VARCHAR) AS date_to_char01
FROM
USERS
現在の日時
select
now() -- "2018-10-22 14:11:39.286429+09"
,current_date -- "2018-10-22"
,current_time -- "14:11:39.286429+09"
,current_timestamp -- "2018-10-22 14:11:39.286429+09"
,date_trunc('hour', current_timestamp) -- "2018-10-22 14:00:00+09"
where 1=1
and event_start_date >= current_date
merge/upsert :無ければ insert、あれば update
INSERT INTO mytable01 (id, target_yymm, category, count, created_at, update_date) VALUES (4, '2018', '1', 1, now())
ON CONFLICT ON CONSTRAINT my_table01_pkey
DO UPDATE SET count = mytable01.count + 1
1行目:普通の INSERT文
2行目:制約名
3行目:INSERTが実行できなかった時の UPDATE文
※制約名は、information_schema.table_constraints から参照。
日付計算
SELECT
CAST('2018/01/28' AS DATE) + interval '1 months' AS "1/28 の1か月後"
,CAST('2018/01/29' AS DATE) + interval '1 months' AS "1/29 の1か月後"
,CAST('2018/01/30' AS DATE) + interval '1 months' AS "1/30 の1か月後"
,CAST('2018/01/31' AS DATE) + interval '1 months' AS "1/31 の1か月後"
,CAST('2018/03/28' AS DATE) + interval '-1 months' AS "3/28 の1か月前"
,CAST('2018/03/29' AS DATE) + interval '-1 months' AS "3/29 の1か月前"
,CAST('2018/03/30' AS DATE) + interval '-1 months' AS "3/30 の1か月前"
,CAST('2018/03/31' AS DATE) + interval '-1 months' AS "3/31 の1か月前"
,CAST('2020/01/28' AS DATE) + interval '1 months' AS "1/28 の1か月後(うるう年)"
,CAST('2020/01/29' AS DATE) + interval '1 months' AS "1/29 の1か月後(うるう年)"
,CAST('2020/01/30' AS DATE) + interval '1 months' AS "1/30 の1か月後(うるう年)"
,CAST('2020/01/31' AS DATE) + interval '1 months' AS "1/31 の1か月後(うるう年)"
,CAST('2020/03/28' AS DATE) + interval '-1 months' AS "3/28 の1か月前(うるう年)"
,CAST('2020/03/29' AS DATE) + interval '-1 months' AS "3/29 の1か月前(うるう年)"
,CAST('2020/03/30' AS DATE) + interval '-1 months' AS "3/30 の1か月前(うるう年)"
,CAST('2020/03/31' AS DATE) + interval '-1 months' AS "3/31 の1か月前(うるう年)"
<9.6>
1/28 の1か月後 2018/2/28 0:00
1/29 の1か月後 2018/2/28 0:00
1/30 の1か月後 2018/2/28 0:00
1/31 の1か月後 2018/2/28 0:00
3/28 の1か月前 2018/2/28 0:00
3/29 の1か月前 2018/2/28 0:00
3/30 の1か月前 2018/2/28 0:00
3/31 の1か月前 2018/2/28 0:00
1/28 の1か月後(うるう年) 2020/2/28 0:00
1/29 の1か月後(うるう年) 2020/2/29 0:00
1/30 の1か月後(うるう年) 2020/2/29 0:00
1/31 の1か月後(うるう年) 2020/2/29 0:00
3/28 の1か月前(うるう年) 2020/2/28 0:00
3/29 の1か月前(うるう年) 2020/2/29 0:00
3/30 の1か月前(うるう年) 2020/2/29 0:00
3/31 の1か月前(うるう年) 2020/2/29 0:00