SQL (Redshift) «начинается с» - PullRequest
       5

SQL (Redshift) «начинается с»

0 голосов
/ 01 ноября 2018

У меня есть одна таблица "префиксов", содержащая префиксы пути, например 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 ().

Есть ли более чистый / быстрый / лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Вы также можете попробовать position(prefixes.value in keys.value)=1

0 голосов
/ 01 ноября 2018

Вы можете сделать сравнение, используя строковые функции:

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

Вы можете адаптировать like, используя escape-символ (которого нет в клавишах):

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

Если ни один из них не быстрее, вы можете использовать оба условия и при этом получить приличную производительность.

...