首页 > 解决方案 > 使用 SQL 从列中提取除最后一个单词之外的所有文本

问题描述

假设我的 items 表中有一个名为name

name
----
Wrench
Hammer (label1)
Screwdriver (label1) (label2)
Tape Measure (label1) (label2) (label3)

我想编写一个 PostgreSQL 查询来提取除最后一个标签(如果存在)之外的所有文本。因此,鉴于上面的数据,我想最终得到:

substring
---------
Wrench
Hammer
Screwdriver (label1)
Tape Measure (label1) (label2)

我怎样才能做到这一点?

标签: sqlpostgresqlsubstring

解决方案


使用子字符串和正则表达式。

语法是:

substring(string, regularExpression)

正则表达式应该使用 () 来分隔要提取的字符串的哪一部分。例如:

substring('abcef', 'b(..)') 

将返回“ce”,即 b 后面的两个字符。如果正则表达式与字符串不匹配,则返回 NULL。

特别是在这种情况下:

dmg@[local] # select substring('Hammer (label1)' from '^(.+)\([^\)]+\)$')   ;
 substring 
-----------
 Hammer 
(1 row)

dmg@[local] # select substring('Tape Measure (label1) (label2) (label3)' from '^(.+)\([^\)]+\)$')   ;
            substring            
---------------------------------
 Tape Measure (label1) (label2) 
(1 row)

推荐阅读