Лучший способ сравнить конец строки, использовать RIGHT, LIKE или другое? - PullRequest
10 голосов
/ 13 сентября 2011

Мне нужно сравнить конец строки со списком возможных концов хранимой процедуры.Это будет называться много, и будет около 10-15 финалов кандидатов.На этом этапе решение с использованием только кода предпочтительнее, чем создание таблиц, предназначенных для этого.Что-то вроде:

IF (ENDSWITH(@var, 'foo') OR
    ENDSWITH(@var, 'bar') OR
    ENDSWITH(@var, 'badger') OR
    ENDSWITH(@var, 'snake'))
(
)

Я ищу лучший способ с точки зрения скорости, а также ремонтопригодности.Кандидаты, о которых я знаю, это

  • RIGHT, мой любимый на данный момент, но это означает, что я должен жестко задавать длину строки, поэтому может быть подвержен ошибкам.Это также означает многократное вырезание исходной строки.

    IF ((LEN(@var) >= 3 AND RIGHT(@var, 3) = 'foo')) OR ...
    
  • НРАВИТСЯ, возможно, медленнее, но немного чище

    IF (@var LIKE '%foo') OR ...
    
  • CHARINDEXскорее всего медленнее, поскольку он ищет всю строку

  • SUBSTRING, наиболее вероятно эквивалентно RIGHT и гораздо более уродливо

  • SQLCLR для создания моей собственнойКОНЕЦ, это может быть довольно быстро

Возможно, есть лучшие способы, о которых я не знаю.Как вы думаете?

Ответы [ 3 ]

15 голосов
/ 13 сентября 2011

Лучший способ оптимизировать это для SQL может состоять в том, чтобы сохранить строковое значение REVERSE в другом столбце, который проиндексирован, и выполнить поиск в левой части этого столбца, используя LEFT или LIKE.

2 голосов
/ 13 сентября 2011

также вы можете использовать комбинацию RIGHT и LENGTH, чтобы не указывать длину строки в жестком коде.

1 голос
/ 13 сентября 2011

Разбор строк будет иметь накладные расходы, лучшее предложение - LIKE '% foo' ИЛИ ​​в качестве опции.Определенные индексы будут иметь преимущество и будут выполнять поиск по сравнению со сканированием.

Вы должны были бы провести сравнительный анализ, чтобы убедиться, что он подходит, но его можно легко проверить.

Проверьте это в отношении LIKE и INDEX http://myitforum.com/cs2/blogs/jnelson/archive/2007/11/16/108354.aspx

...