【问题标题】:postgresql 9.5: trying to split a string into two fields based on spacespostgresql 9.5:尝试根据空格将字符串拆分为两个字段
【发布时间】:2017-05-22 04:25:45
【问题描述】:

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

 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"   ""

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

我尝试的查询如下:

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

谁能告诉我如何修复这个查询以获得上面指定的目标?

【问题讨论】:

  • 双引号实际上是您数据的一部分吗?
  • 是的,这些都是字符串。原始数据就是这样来的。我可以在变量被分离出来后对它们应用强制转换,但为了这个最小的例子,我只想保持简单。但答案是wwhid、wv002、wv003变量都是文本。
  • 那么您正在将这些双引号存储在数据库中吗?
  • 我认为它们是单引号。我这么说的唯一原因是因为如果我尝试使用双引号,那么我通常会收到关于表名之类的错误——因为双引号也用于表名,对。

标签: sql regex postgresql split


【解决方案1】:

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];

【讨论】:

  • 啊,太好了。这行得通。谢谢你的提示。我不知道split_part 没有接受正则表达式。感谢您在这方面的帮助。
  • @krishnab: 另请注意,在 Postgres 中,正则表达式/ 开头(除非您的意思是在正则表达式中包含 / 作为常量字符)
  • 好的,谢谢。我对不同的正则表达式方言感到困惑。我会记住这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
  • 2019-07-23
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多