我有几个这样的字符串:
1:723:NVDA:NSDQ::Z4189274321:Snapshot Report:10:COMPUTER & TECHNOLOGY:241:Semiconductor
我需要返回第二个冒号 ( :
) 之后的所有内容。因此,从上面的字符串中我需要:
NVDA:NSDQ::Z4189274321:Snapshot Report:10:COMPUTER & TECHNOLOGY:241:Semiconductor
看到了很多例子,但没有一个真正适用于这项任务。
这
string_to_array
从这里使用:https://www.postgresql.org/docs/current/functions-string.html
这会将字符串分解成其组成部分,并将它们组成一个数组。
[3:]
从数组中选择第三个到最后一个元素。然后从这里:
https://www.postgresql.org/docs/current/functions-array.html
这通过将数组元素与分隔符连接起来来重新构成字符串。
最短
substring()
使用正则表达式:正则表达式解释:
^
... 锚点到字符串的开头(可选).
... 任何字符+?
... 1 次或多次,非贪婪:
... 文字字符(2 次)
(.*$)
... 任何字符 0 次或多次,贪婪;在捕获括号中最快的
如果性能很重要...
上面的代码简单而简短,因此性能不错。但正则表达式很昂贵。即使像Adrian演示的那样转换为数组并返回(成本高昂),通常也更快。
这比迄今为止建议的任何方法都要快几倍:
这个通过分割内容返回一个数组:
如果您需要一个字符串:
这个使用正则表达式来分割内容并返回一个数组,但只有一个元素,并且很容易转换为单个字符串:
下面演示了使用
NULLIF
和REGEXP_REPLACE
正则表达式^(([^:]*:){2}(.*))|(.*)
来提取第二个之后的字符串部分:
,或者NULL
如果第二个之后没有字符:
:以下脚本测量与生成测试字符串(测试表达式)相关的开销
s.string||gs.n::TEXT
以及返回第二个之后出现的字符串部分的四个表达式中的每一个表达式的执行时间:
: