【问题标题】:Alternative for REGEXP_INSTR command output in Amazon RedShiftAmazon RedShift 中 REGEXP_INSTR 命令输出的替代方法
【发布时间】:2017-07-29 05:20:23
【问题描述】:

大家都知道,Oracle/PLSQL 中的REGEXP_INSTR 命令允许您在字符串中搜索正则表达式模式。它还提供了三个参数,分别是start_positionnth_appearancereturn_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 命令不支持参数。我正在寻找替代方法来返回匹配发生位置的下一个位置值。

【问题讨论】:

  • 您的描述不太正确。除非 /regex1/ 匹配单个字符,否则返回值将高于 4 - 它是匹配部分结束后的位置,而不是匹配开始后的位置;它将从该位置获取 15 个字符,即 4 到 18 而不是 4 到 15。

标签: oracle amazon-redshift


【解决方案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)

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

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

【讨论】:

  • 第一次出现是我想要的。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
  • 1970-01-01
相关资源
最近更新 更多