質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

2回答

6410閲覧

postgresqlで"select"した結果を変数に格納したい。

merci_children

総合スコア44

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2018/12/15 05:30

編集2018/12/15 06:05

【やりたいこと】
インプットデータのcsvファイルをpostgresqlのCOPY文で挿入し、
直前で挿入したデータのみ出力(select)したい。

【やってみてること】
1.DBに挿入する前に現在の時間を取得する。
2.DBに挿入する。
3.1で取得した日付以降のデータを出力(select)する。

【困っていること】
1で現在の時間を取得を変数に格納することができず、困っています。
ご教授頂けると助かります。

CREATE TABLE testDB (ID SERIAL NOT NULL, test1 INT4 NOT NULL, test2 INT4 NOT NULL, REG_DATE TIMESTAMP);
# 1 やってみたけどだめでした。select now()という文字と認識されてしまう。 \set zikan select now(); # 2 \COPY testDB(test1, test2, REG_DATE) FROM '/tmp/inputCSV/__test.csv' WITH CSV; # 3 \COPY (SELECT * FROM testDB WHERE REG_DATE > zikan) TO '/tmp/testDB.csv' WITH CSV DELIMITER ',';

●CSVデータ
1,1,now()
2,2,now()
3,3,now()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/12/15 05:36

now()だけならそれ自体変数のようなのものなのであえてsetする必要はないような…?
m.ts10806

2018/12/15 05:37

VIEWにするとどうでしょうか
merci_children

2018/12/15 05:41

すいません。。。 無知で申し訳ないのですが、VIEWにするとはどういうことでしょうか。 (VIEWがわかってないです。) また、now()を変数に格納したい理由は、selectで直前で挿入したデータのみを抽出したいからです。
sazi

2018/12/15 05:49

現在時刻で挿入し、現在時刻以降を取得して、対象のデータはが存在するんですか?
sazi

2018/12/15 05:51

COPY時点を記録して、その記録以降というなら分かりますが、その場合記録するのは変数じゃないですね。
merci_children

2018/12/15 06:01

すいません。。。理解が追い付いてないのですが。 現在時刻で挿入し、現在時間以降を取得すれば直前で挿入した情報のみ取得できると考えたんですが、対象のデータは取得できませんか? また、COPY時点を記録してその記録以降のデータを抽出するやり方がほかにあれば教えていただきたいです。
m.ts10806

2018/12/15 06:02

csvにどのような情報があるのか提示いただいた方が良いかもしれませんね
merci_children

2018/12/15 06:06

ありがとうございます。 CSVデータを追記いたしました。
guest

回答2

0

ベストアンサー

CSV中にnow()を埋めてもコマンドみたいに実行されるわけではないですよ。単なる文字列です。
やるなら、テーブルの方に初期値を持たせます。

SQL

1CREATE TABLE testDB 2(ID SERIAL NOT NULL, 3test1 INT4 NOT NULL, 4test2 INT4 NOT NULL, 5REG_DATE TIMESTAMP default current_timestamp 6);

それから、その初期値の項目を含めないCSVにして、COPYすれば初期値が設定されます。

\COPY testDB(test1, test2) FROM '/tmp/inputCSV/__test.csv' WITH CSV;

その上で直前の時刻を知りたいのであれば、

select max(REG_DATE) from testDB

とすれば取得できます。
前回の質問の続きで、追加したものだけ取得したいということであれば以下で取得が可能です。

select * from testDB where REG_DATE=(select max(reg_date) from testDB)

追記

変数については以下を参考に。
クエリ結果をpsqlの変数やシェルの環境変数に格納

投稿2018/12/15 06:34

編集2018/12/15 06:44
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

merci_children

2018/12/15 06:53

いつも丁寧にご回答いただきありがとうございます。 とても助かっています。 試してみた結果うまく期待した結果を取得することができました。 ありがとうございました。
sazi

2018/12/15 06:55

因みに、current_timestampはトランザクションの開始時刻なので、copyコマンドで処理された複数のデータは全て同じ時刻になっているから、=Max()で取得が可能です。
merci_children

2018/12/15 07:01

追記ありがとうございます。 そうなのですね。 すべて同じ時刻になるのですね。 アドバイスありがとうございます。
sazi

2018/12/15 07:06

そうです。リアルな時刻の場合は、clock_timestampを使用します。 なので、今回のような場合はcurrent_timestampを使用する事で、シェル側で前後の時間を取得してその期間内で取得するような面倒なことをしなくて済むわけです。
merci_children

2018/12/15 07:24

なるほど。 ご丁寧にアドバイスをくださり、ありがとうございます。 引き続きがんばります。
guest

0

COPY した時刻は処理が早ければ同時刻になる可能性があるので、そもそもそのやり方は無理があると思います。
ID SERIAL というフィールドがあるのであれば、max(ID) な列を取得すれば最後に COPY した列が取得できるのでは?

投稿2018/12/15 06:11

ssasaki

総合スコア1167

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

merci_children

2018/12/15 06:22

ご回答ありがとうございます。 アドバイスの通り、そちらのほうがよそそうです。(固執していました。。。) ただ、max(ID)を取得し、変数に格納する方法がわからないです。 教えていただきたいです。。。
ssasaki

2018/12/15 06:45

こういうことを期待していますか? select max(id) as reg_id from testDB \gset; select :reg_id;
merci_children

2018/12/15 06:54

ありがとうございます。 変数への格納はそのようにやるのですね。 勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問