PostgreSQL:在数字开始之前提取文本

时间:2018-11-22 08:32:52

标签: postgresql

我有一个表格os,其中包含以下数据

id         name
--         ----
1          windows server 2012 R2
2          windows 2016 SQL
3          Oracle linux 7.5

我需要将os表更新为以下内容

id         name
--         ----
1          windows server
2          windows
3          Oracle linux

基本上,我需要从名称中以数字开头到开头提取文本。

我不知道如何执行此操作。如何在Postgresql查询中做到这一点?

3 个答案:

答案 0 :(得分:2)

您可以尝试一下。它从头开始,在数字之前找到不是数字的任何内容,然后将其替换为匹配的字符串。

SELECT s,RTRIM(regexp_replace (s, '^([^\d]+)\d(.*)$', '\1')) as m
FROM   ( VALUES ('windows server 2012 R2'), 
                ('windows 2016 SQL'), 
                ('Oracle linux 7.5' ) ) AS t(s); 


           s            |       m
------------------------+----------------
 windows server 2012 R2 | windows server
 windows 2016 SQL       | windows
 Oracle linux 7.5       | Oracle linux
(3 rows)

答案 1 :(得分:2)

函数substring可以指定正则表达式:

所以一些解决方案可以像这样:

postgres=# select name, trim(substring(name from '[^\d]+')) from the_table;
+----------------------------+----------------+
|            name            |     btrim      |
+----------------------------+----------------+
| windows server 2012 R2 foo | windows server |
| windows 2016 SQL           | windows        |
| Oracle linux 7.5           | Oracle linux   |
+----------------------------+----------------+
(3 rows)

documentation中的更多内容

答案 2 :(得分:1)

在这种情况下,缺少基于正则表达式查找字符串的函数有点麻烦。

您可以使用regexp_matches()查找字符串中第一个数字的第一个模式,然后将其与substr()和strpos()`结合以提取之前的所有内容:

select id, substr(name, 1, strpos(name, (regexp_matches(name, '[0-9.]+'))[1]) - 1)
from the_table;

regexp_matches()返回所有匹配项的数组。因此,我们需要从该数组中提取第一个第一个匹配项。 (regexp_matches(name, '[0-9.]+'))[1]就是这样做的。

在线示例:https://rextester.com/BIOV86746