2017-05-22 64 views
0

我在postgres表中有一个字段,如下表所示。我想根据空格作为分隔符将字符串拆分为两个单独的组件。注意所有的字段都是TEXT。postgresql 9.5:试图将一个字符串拆分为两个空格字段

tablename: intersection_table_wi 
wwhid 
----- 

"102 5" 
"104 61" 
"103 84" 

所以我想将其转换为一个目标是这样的:

wwhid  wv002  wv003 
-----  -----  ----- 

"102 5" "102"  "5" 
"104 61" "104"  "61" 
"103 84" "103"  "84" 

的问题是,当我写的查询我一直得到的东西,看起来更像是这样的:

wwhid  wv002  wv003 
-----  -----  ----- 

"102 5" "102 5" "" 
"104 61" "104 61" "" 
"103 84" "103 84" "" 

现在微妙的问题是,在某些情况下,两个子串之间有多于一个空格,而在其他情况下只有一个空格。

我试着查询如下:

UPDATE intersection_table_wi 
SET wv002 = SPLIT_PART(BTRIM(whhid), '/\s+', 1), 
wv003 = SPLIT_PART(BTRIM(whhid), '/\s+', 2); 

谁能告诉我怎样才能解决这个查询来获取上述规定的目标是什么?

+0

是双引号实际数据的一部分? –

+0

是的,这些都是字符串。这就是原始数据的来源。我可以在将变量分离出来之后将变体应用到变量中,但为了简化示例,我只是想简化它。但答案是,wwh002,wv002,wv003变量是文本。 – krishnab

+1

因此,你*将这些双引号存储在数据库中? –

回答

3

split_part()不支持正则表达式。您只能指定一个“简单”字符串作为分隔符。

拆就一个正则表达式,你需要regexp_split_to_array()

UPDATE intersection_table_wi 
    SET wv002 = (regexp_split_to_array(BTRIM(whhid), '\s+'))[1], 
     wv003 = (regexp_split_to_array(BTRIM(whhid), '\s+'))[2]; 
+0

啊优秀。这工作。谢谢你的提示。我不知道'split_part'没有使用正则表达式。我感谢你的帮助。 – krishnab

+0

@krishnab:还要注意,正则表达式不是**,在Postgres中用'/'开头(除非你的意思是把'/'作为常量字符包含在正则表达式中) –

+0

好的,谢谢。我对不同的正则表达式方言感到困惑。我会牢记这一点。 – krishnab