【问题标题】:SQL (Redshift) "starts with"SQL (Redshift) “开始于”
【发布时间】:2018-11-01 16:07:35
【问题描述】:

我有一个包含路径前缀的表“前缀”,例如a/b/c/,以及另一个包含绝对路径的表“键”,例如a/b/c/foo.txt

我将在(概念上)“key.value 以 prefix.value 开头”加入后者反对前者。

最初我尝试过

keys.value like prefixes.value || '%'

...但这对于包含对“like”运算符有意义的字符的前缀是有问题的,例如_%

我决定了:

substring(keys.value, length(prefixes.value)) = prefixes.value

...但是速度要慢得多。其他帖子建议使用 regexp_replace 来转义前缀中的特殊字符,然后使用带有尾随 % 的 like 运算符,但考虑到 regexp_replace(),我无法想象这是性能方面的改进。

有没有更清洁/更快/更好的方法来完成这个?

【问题讨论】:

  • 你能修改涉及的表吗?理想情况下,我会在“keys”表中添加一列,其中只包含键的前缀部分,希望两个表都分布在该列上,这样就可以对键进行简单有效的连接。

标签: sql query-optimization amazon-redshift


【解决方案1】:

您可以使用字符串函数进行比较:

from prefixes f join
     keys k
     on p.value = left(k.value, length(p.value))

您可以使用转义字符(不在键中)调整like

from prefixes f join
     keys k
     on k.value like replace(replace(p.value, '_', '#_'), '%', '#%') escape '#'

如果这两个条件都不是更快,那么您也许可以同时使用这两种条件并且仍然获得不错的性能。

【讨论】:

    【解决方案2】:

    你也可以试试position(prefixes.value in keys.value)=1

    【讨论】:

      猜你喜欢
      • 2021-06-17
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 2021-10-23
      • 2018-11-04
      • 2021-10-07
      相关资源
      最近更新 更多