Amazon RedShift中REGEXP_INSTR命令输出的替代方案

时间:2017-03-08 15:01:00

标签: oracle amazon-redshift

大家都知道 Oracle / PLSQL 中的REGEXP_INSTR命令允许您在字符串中搜索正则表达式模式。它还提供三个参数,即 start_position nth_appearance return_option

Redshift也支持same command,但不支持所有三个参数,因为以下查询在Oracle / PLSQL中完全起作用,在Redshift中不起作用。

substr(some_string,REGEXP_INSTR(some_string,'/ regex1 /',1,1,1),15)); (redshift使用substring而不是substr)

在上面的查询中,REGEXP_INSTR返回模式出现后字符的位置,因为我们已将return_option设置为1。 (即如果匹配在第3位结束,则返回4.因此,从位置4开始,将从“some_string”中提取15个字符)

我们无法在Redshift中将返回选项设置为1,因为REGEXP_INSTR命令不支持参数。我正在寻找替代方法来返回匹配发生位置的下一个位置值。

1 个答案:

答案 0 :(得分:1)

在Oracle中你可以这样做:

substr(some_string, regexp_instr(some_string, '/regex1/', 1, 1, 0)
  + length(regexp_substr(some_string, '/regex1/', 1, 1)), 15)

regexp_substr()为您提供与regexp_instr()调用匹配相同模式的字符串部分;将匹配的部分的长度添加到instr位置会使结果偏移那么多。这与将return-opt设置为1具有相同的效果,至少在这种情况下。

不熟悉RedShift,但从文档来看,它看起来应该是同样的事情:

substring(some_string, regexp_instr(some_string, '/regex1/', 1)
  + len(regexp_substr(some_string, '/regex1/', 1)), 15)

当你使用默认值1时,可以在两个版本中跳过position参数,因为Oracle中的nth-occurrence参数(现在return-opt也是默认值);但如果您不想第一次出现,这仍然无效。您需要修改模式以尝试获取稍后的事件。希望这不是一个问题。

如果没有匹配或其他边缘情况,您还需要检查是否发生(在两个系统中)。