Postgresql

如何在 PostgreSQL 上選擇兩個 CSV 文件/…?

  • May 16, 2017

我有兩個 CSV 文件,您可以將它們插入到以下PostgreSQL架構中。

但是,我不能\COPY將數據放入表中。虛擬碼

  1. data_id=1
  2. 分別顯示 name 和event_valuefrom data.csvlog.csv
  3. 從 R 執行此請求並連接到 PostgreSQL

換句話說,虛擬碼但語法不正確

SELECT name, event_value 
   FROM data, log
   WHERE data_id=1;

CSV 文件

我在 CSV 文件中用雙引號將標題括起來(執行緒PG COPY 錯誤:invalid input syntax for integer)。 data.csv其中兩個整數/SERIAL + 整數

"data_id", "event_value"
1, 777
1, 666
2, 111
4, 123 
3, 324
1, 245

log.csv where integer/SERIAL + string 所以我把後一個用雙引號括起來

"data_id", "name"
1, "leo"
2, "leopold"
3, "lorem"

PostgreSQL

架構和工作流程

DROP TABLE IF EXISTS data, log;    
CREATE TABLE data (
       data_id SERIAL NOT NULL, -- no primary key possible here, because possible have many events per data id
       event_value INTEGER NOT NULL
);
CREATE TABLE log (
       data_id SERIAL PRIMARY KEY NOT NULL,
       name INTEGER NOT NULL
);

-- https://stackoverflow.com/a/2987451/54964
-- https://soleil4716.wordpress.com/2010/08/19/using-copy-command-in-postgresql/
-- joanolo, HEADER
\COPY data FROM '/home/masi/Data/data.csv' DELIMITER ',' CSV HEADER;
\COPY log FROM '/home/masi/Data/log.csv' DELIMITER ',' CSV HEADER;

工作流程虛擬碼

  1. 從乾淨的表開始(刪除舊表)並創建新表
  2. 將兩個 CSV 文件插入表中
  3. 現在執行 SELECT 並從 R 連接到 PostgreSQL

輸出

masi@masi:~$ psql -f schema.sql 
psql:schema.sql:1: NOTICE:  table "data" does not exist, skipping
DROP TABLE
CREATE TABLE
CREATE TABLE
COPY 6
psql:schema.sql:14: ERROR:  invalid input syntax for integer: " leo"
CONTEXT:  COPY log, line 2, column name: " leo"

基於執行緒PG COPY error: invalid input syntax for integer ,我不應該在 CSV 文件中出現錯誤。

作業系統:Linux Debian 8.7

PostgreSQL:9.4

相關:R sqldf執行緒中的 /… 方法如何通過 R sqldf/data.table/dplyr 選擇 CSV 文件?

錯誤很明顯,因為您打算將字元添加到整數定義的列。只需將日誌表中名稱列的數據類型從整數更改為 varchar(10)

想要的 SELECT 可以做為

-- https://unix.stackexchange.com/a/364970/16920
SELECT a.event_value, b.name
   FROM data a, log b
   WHERE a.data_id = 1
     AND a.data_id=b.data_id;

引用自:https://dba.stackexchange.com/questions/173532