【问题标题】:Map data posgtresqsql映射数据 postgresql sql
【发布时间】:2020-12-21 16:58:01
【问题描述】:

希望你没事,

我想读取 /home/BNP/File.csv 中存在的 csv 文件

我的文件 1 包含 3 列 COL_、COL1 和 COL2。 我的数据示例

SCHOOLAA/Fourniture/pencil, SCHOOL, SCHOOL
HOMEAA/Fourniture/desk, HOME OFFICE, HOME
HOMEAA/Fourniture/,  HOME, FOURNITURE

我的数据库表 dab 的值:

 id,      COL_

221323, SCHOOL12/Fourniture/pencil

221324, SCHOOL13/Fourniture/pencil

221325, HOME00/Fourniture/desk

221326, SCHOOL14/Fourniture/pencil

221327, HOME01/Fourniture/

221328, HOME04/Fourniture/

我想创建包含三列 COL_、COL1、COL2 的表 dabres

**Result:** 
**COL_                         COL1       COL2**

SCHOOL12/Fourniture/pencil.   , SCHOOL, SCHOOL

SCHOOL13/Fourniture/pencil.   , SCHOOL, SCHOOL

HOME00/Fourniture/desk       ,HOME OFFICE, HOME

SCHOOL14/Fourniture/pencil   ,SCHOOL, SCHOOL

HOME01/Fourniture/         ,HOME, FOURNITURE

HOME04/Fourniture/       ,HOME, FOURNITURE

我在下面做了一个尝试,我如何在读取文件时动态地做到这一点。让我们注意到我的 File.csv 包含 50 行,因此逐个吃起来不太容易。

代码

execute $$
INSERT INTO $$||new_table_name||$$
(COL_, COL1, COL2)
SELECT * from (
       (case
            when TRIM(COL_) ~ '^SCHOOL[0-9]{2}/Fourniture/desk/'
            then HOME OFFICE
            when TRIM(COL_) ~ '^SCHOOL[0-9]{2}/Fourniture/pencil/'  
            then 'SCHOOL'
            when TRIM(COL_) ~ '^SCHOOL[0-9]{2}/Fourniture/'  
            then 'HOME'
            else 'NONE'
      end) as COL1,
  (case
            when TRIM(COL_) ~ '^SCHOOL[0-9]{2}/Fourniture/desk/'
            then HOME
            when TRIM(COL_) ~ '^SCHOOL[0-9]{2}/Fourniture/pencil/'  
            then 'SCHOOL'
            when TRIM(COL_) ~ '^SCHOOL[0-9]{2}/Fourniture/'  
            then 'FOURNITURE'
            else 'NONE'
      end) as COL2

 )

最好的问候, 谢邀!!

【问题讨论】:

  • 为什么不把CREATE TABLE dabres(COL_ varchar,COL1 varchar, COL2 varchar) and then COPY` csv 放进去呢?
  • 不,也许我不清楚。如果 col_ of dab='VALUE',我的文件 FIL1.txt 只是为了查看 COL1 和 COL2 应该包含的内容。你明白我的意思吗?请告诉我如果我不清楚@AdrianKlaver
  • 不,我没有。你说你想阅读或迭代File.csv 中的 50 行。我看不到dabdabres 之间的关系,因为我看不到dab.id 正在被使用。
  • dabresdab 的新表,其中映射了新列。是的,你是对的,我只是忘记在我的代码中添加 dab.id。我还是不清楚,? @AdrianKlaver
  • 在我看来,CSV 中的“AA”代表某种用于加入 dab 表的通配符。可能最容易将dab 中的数字“屏蔽”为通配符,例如将 csv 加载到 dabtemp 并加入 ON REGEXP_REPLACE(dab.CSV_,'[0-9]{2}/','AA/')=dabtemp.CSV_

标签: sql postgresql plpgsql


【解决方案1】:

这是未经测试的,因此请在测试环境中执行此操作。还假设使用psql:

CREATE TABLE dab_col_map("COL_" varchar, "COL1" varchar, "COL2" varchar);

\copy dab_col_map FROM 'File.csv' WITH (CSV);

CREATE TABLE 
   dabres 
AS 
   SELECT 
      dab.id, db."COL_", dab_col_map."COL1", dab_col_map."COL2" 
   FROM 
      dab 
   LEFT JOIN 
      dab_col_map 
   ON 
      dab."COL_" = dab_col_map."COL_";

这假定数据库中的列名实际上是大写的。如果没有,那么您不需要引用。

【讨论】:

  • 正如@Adrian Klaver 所说,但使用ON REGEXP_REPLACE(dab."COL_",'[0-9]{2}/','AA/')=dab_col_map."COL_" 而不是简单的相等。上面的db."_COL" 也应该是dab."COL_"(小错字)
猜你喜欢
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 2019-03-11
  • 2015-03-09
  • 1970-01-01
  • 2017-08-20
相关资源
最近更新 更多