在postgresql中,我需要从给定列的字段中提取3个特定的字母数字字符,然后从中创建年份。因此,如果字段的值是FUT,GRA,S12,1055559
或S11,1050830,PON
,我需要S11
或S12
,然后创建2011
或2012
。
结果可以保留为文本字段。
我用了以下方法来取出S??
:substring(my_field from E'(S\\d\\d),')
但创造一年似乎更具挑战性。我本来希望使用regexp_split_to_array
,但似乎效果不太好。
最佳答案
你看起来就快到了——你只需要在提取的“12”和“11”后面加上“20”:
已更新(PostgreSQL没有边界\b
(?!)):
SELECT '20'||substring(my_field from E'(?:^|\\W)S(\\d\\d)(?!\\w)') ....
-- NOTE: Old version. However there's no '\b' in this regex flavour.
SELECT '20'||substring(my_field from E'\\bS(\\d\\d)\\b') ....
你必须避免反斜杠。此外,在正则表达式中使用括号意味着所选子字符串将是“12”或“11”,不包括“S”。
'20'||xxxx
只是将两个字符串连接起来。(?:^|\\W)
确保Sxx
位于字符串的开头,或者前面是非单词字符(如空格或逗号)。这可以防止S13
中的FUT,GRAS13,S12
被匹配。(?!\\w)
确保Sxx
后面没有另一个单词字符(即不是较大单词的一部分)。这可以防止S13
在S132,GRA,S12
中匹配。(注意-我之前有
\b
这意味着“单词边界”,但是PostgreSQL regex不支持这个,所以(?:^|\W)
和(?!\w)
是模拟这个的方法。