在postgresql中,我需要从给定列的字段中提取3个特定的字母数字字符,然后从中创建年份。因此,如果字段的值是FUT,GRA,S12,1055559S11,1050830,PON,我需要S11S12,然后创建20112012
结果可以保留为文本字段。
我用了以下方法来取出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后面没有另一个单词字符(即不是较大单词的一部分)。这可以防止S13S132,GRA,S12中匹配。
(注意-我之前有\b这意味着“单词边界”,但是PostgreSQL regex不支持这个,所以(?:^|\W)(?!\w)是模拟这个的方法。

08-24 12:30