我有一个表,其中包含一个名为info
. 此字段包含有关驾驶员和汽车的一些信息,例如“驾驶员:马特汽车:野马”。
有没有办法在两列中获取查询,例如:| Matt | Mustang |
.
我不知道我能做什么,也许是正则表达式?
我有一个表,其中包含一个名为info
. 此字段包含有关驾驶员和汽车的一些信息,例如“驾驶员:马特汽车:野马”。
有没有办法在两列中获取查询,例如:| Matt | Mustang |
.
我不知道我能做什么,也许是正则表达式?
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”并不重要。
如果我没有理解错误,您可以使用string_to_array
函数将字符串拆分为数组元素,然后达到您想要的元素。
请参阅这篇文章以获取更多信息:获取从“string_to_array()”函数返回的数组的第 N 个元素
您正在谈论的是一种非常不幸的设计模式,称为序列化:即将多个语义不同的数据块压缩成一个字符串。大多数时候这是一个坏主意,而且在几乎所有情况下,将数据分成多个字段甚至多个表是一个更好的主意。通过使用序列化字段,您会发现:
如果我必须处理这样的数据库,并且我无法更改数据库结构,我可能最终会在程序代码中做很多繁重的工作。许多语言拥有比 SQL 更好(或至少更直观)的字符串处理工具,而且在处理序列化时,使用 RDBMS 带来的性能优势最多只能是微不足道的。
但是,如果您绝对必须在 SQL 中执行此操作,您应该阅读 Postgres 的字符串处理,位于此处:http ://www.postgresql.org/docs/9.1/static/functions-string.html
你是对的,你的解决方案可能会涉及到一个正则表达式。该正则表达式的确切外观取决于它必须解析多少个序列化字段,以及它是如何分隔的。在您的示例中,看起来每个子字段由一对空格和它们之间的管道字符分隔,如果是这种情况,请确保您创建规则以根据需要转义该分隔符,或者确保前端从不将分隔符传递给数据库。
当然,如果您对前端应用程序有这种控制,您可以为序列化数据提供自己的字段。
最好的办法是编写一个函数来获取这些值之一,并根据它找到的内容返回一个包含适当列的记录。这将允许您在填充新列(或表)之前使用 SELECT 语句调试函数。然后您可以在INSERT
/SELECT
或中使用查询UPDATE ... FROM
。
您可以使用 plpgsql 语言作为函数,使用 PostgreSQL 正则表达式字符串函数;但如果你精通 perl 或 python,你可能想用其中一种语言编写函数。
我这样做了:
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) 作为车库司机
一点也不漂亮,但根据我的需要返回数据