2017-04-19 64 views
1

我想用一個JSON柱首先創建一個臨時表來加載一個格式化的JSON文件,在負載格式化JSON來PostgreSQL表

{ 
"EId":"104111", 
"Category":"(0)", 
"Mac":"ABV", 
"Path":"chemin2", 
"ID":"System.Byte" 
} 

形式,

create temporary table temp_json (values json); 
copy temp_json from '/path_to_the_file/test.json'; 
select values->>'EId' as EId, 
     values->>'Category' as Category, 
     values->>'Mac' as Mac, 
     values->>'Path' as Path, 
     values->>'ID' as ID  
    from(
      select json_array_elements(values) as values 
      from temp_json 
) a; 

,但它顯示以下消息:

ERROR: invalid input syntax for type JSON 
DETAIL: The input string ended unexpectedly. 
CONTEXT: JSON data, line 1: { 
COPY temp_json, line 1, column values: "{" 

一旦我擦除所有的空白,指令通過沒有錯誤。

+0

請[編輯]你的問題,並添加** **確切的SQL語句所使用。 –

+0

整個對象需要在文件 –

+0

@ClodoaldoNeto中的單行中,謝謝,我知道這些信息,但是有辦法繞過它。意思是在一個文件中加載已解析格式化的json數據? –

回答

2

假設一個文件是這樣的:

{ 
"EId":"104111", 
"Category":"(0)", 
"Mac":"ABV", 
"Path":"chemin2", 
"ID":"System.Byte" 
} 
{ 
"EId":"104112", 
"Category":"(1)", 
"Mac":"CBV", 
"Path":"chemin3", 
"ID":"System.Byte" 
} 

臨時表將收到的文本並不JSON:

create temporary table temp_json (values text); 
\copy temp_json from '/path_to/input.json'; 

的最終表將有json專欄:

create table t (obj jsonb); 

一些字符串操作:

insert into t (obj) 
select 
    regexp_split_to_table(
     replace(v, $$"}{"$$, $$"}djue748wBc,l;09{"$$), 
     'djue748wBc,l;09' 
    )::jsonb 
from (
    select string_agg(values, '') as v 
    from temp_json 
) s; 
              obj            
-------------------------------------------------------------------------------------------- 
{"ID": "System.Byte", "EId": "104111", "Mac": "ABV", "Path": "chemin2", "Category": "(0)"} 
{"ID": "System.Byte", "EId": "104112", "Mac": "CBV", "Path": "chemin3", "Category": "(1)"} 
+0

非常感謝,您的解決方案正在工作,但我似乎無法弄清楚什麼(替換(v,$$「} {」$$,$$「} djue748wBc,l; 09 {」$$), 'djue748wBc,l; 09')呢? –

+0

@ponach有必要引入一個隨機字符串來分割對象。 –

1

我不認爲你正確地引用了這一點。請參閱quotingcopy上的文檔。

這當然是可能的,

CREATE TEMPORARY TABLE foo 
AS 
    SELECT $${ 
    "EId":"104111", 
    "Category":"(0)", 
    "Mac":"ABV", 
    "Path":"chemin2", 
    "ID":"System.Byte" 
    }$$::jsonb AS jsondata;