1

我有一个表,其中包含一个名为info. 此字段包含有关驾驶员和汽车的一些信息,例如“驾驶员:马特汽车:野马”。

有没有办法在两列中获取查询,例如:| Matt | Mustang |.

我不知道我能做什么,也许是正则表达式?

4

5 回答 5

2
WITH tbl(id, info) AS (
   VALUES
    (1::int, 'Driver: Matt Car: Mustang'::text)
   ,(2,      'Driver: Billy Car: Porsche')
   )
SELECT id
      ,split_part(info, ' ', 2) AS driver
      ,split_part(info, ' ', 4) As car
FROM   tbl;

回报:

 id | driver  | car
----+---------+---------
  1 | Matt    | Mustang
  2 | Billy   | Porsche

只要空格在那里并且名称在空格的右侧,您是否用什么字符串代替“Driver”和“Car”并不重要。

于 2012-08-09T13:22:25.190 回答
1

如果我没有理解错误,您可以使用string_to_array函数将字符串拆分为数组元素,然后达到您想要的元素。

请参阅这篇文章以获取更多信息:获取从“string_to_array()”函数返回的数组的第 N 个元素

于 2012-08-09T10:39:26.313 回答
0

您正在谈论的是一种非常不幸的设计模式,称为序列化:即将多个语义不同的数据块压缩成一个字符串。大多数时候这是一个坏主意,而且在几乎所有情况下,将数据分成多个字段甚至多个表是一个更好的主意。通过使用序列化字段,您会发现:

  • 查询多个序列化子字段时,查询速度要慢得多
  • 用于更新同一字段的多个部分的复杂查询
  • 抑郁和绝望的感觉

如果我必须处理这样的数据库,并且我无法更改数据库结构,我可能最终会在程序代码中做很多繁重的工作。许多语言拥有比 SQL 更好(或至少更直观)的字符串处理工具,而且在处理序列化时,使用 RDBMS 带来的性能优势最多只能是微不足道的。

但是,如果您绝对必须在 SQL 中执行此操作,您应该阅读 Postgres 的字符串处理,位于此处:http ://www.postgresql.org/docs/9.1/static/functions-string.html

你是对的,你的解决方案可能会涉及到一个正则表达式。该正则表达式的确切外观取决于它必须解析多少个序列化字段,以及它是如何分隔的。在您的示例中,看起来每个子字段由一对空格和它们之间的管道字符分隔,如果是这种情况,请确保您创建规则以根据需要转义该分隔符,或者确保前端从不将分隔符传递给数据库。

当然,如果您对前端应用程序有这种控制,您可以为序列化数据提供自己的字段。

于 2012-08-08T15:04:28.483 回答
0

最好的办法是编写一个函数来获取这些值之一,并根据它找到的内容返回一个包含适当列的记录。这将允许您在填充新列(或表)之前使用 SELECT 语句调试函数。然后您可以在INSERT/SELECT或中使用查询UPDATE ... FROM

您可以使用 plpgsql 语言作为函数,使用 PostgreSQL 正则表达式字符串函数;但如果你精通 perl 或 python,你可能想用其中一种语言编写函数。

于 2012-08-08T15:52:04.793 回答
0

我这样做了:

select split_part(( case when
strpos(l.info,'Driver:') >= 1 then substr(l.info,strpos(l.info,'Driver:')+10, strpos(l.info,'Driver: ')+9) end),E'\n',1) 作为车库司机

一点也不漂亮,但根据我的需要返回数据

于 2012-08-09T12:49:18.667 回答