我有一个表格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查询中做到这一点?
答案 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]
就是这样做的。