Любой способ упростить это выражение подстановки LIKE в T-SQL, не прибегая к CLR? - PullRequest
0 голосов
/ 19 ноября 2009

У меня есть столбец с именами баз данных, например:

    testdb_20091118_124925 
    testdb_20091119_144925 
    testdb_20091119_145925
    ect...

Есть ли более элегантный способ вернуть только похожие записи, используя это выражение:

select * from sys.databases where name 
LIKE 'testdb[_][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][_][0-9][0-9][0-9][0-9][0-9][0-9]'

Ответы [ 2 ]

2 голосов
/ 19 ноября 2009

Нет, я не боюсь "элегантного" решения.

Кроме того, введение функций, «родных» или CLR, в предложении WHERE не позволит SQL использовать индексы для разрешения предиката (ему придется сканировать всю таблицу, если не поможет какой-то другой предикат, по частям)

Несколько замечаний:

  • здесь может быть приемлемо использование подчеркивания, поскольку целевые значения, похоже, следуют очень регулярному шаблону. Однако подчеркивание при использовании с LIKE само по себе является подстановочным знаком (соответствует одному и ровно одному символу). Если вы действительно хотите указать подчеркивание, «экранируйте» их, заключив их в квадратные скобки, то есть 'abc[_]def' будет точно соответствовать 'abc_def', но не, например, 'abcXdef'.
  • выражение можно сделать более избирательным и более коротким с такими вещами, как
    'testdb_20[0-9][0-9][0-1][0-9][0-3][0-9][_][0-9][0-9][0-9][0-9][0-9][0-9]'

т.е. предполагая, что даты будут в этом столетии и ограничиваясь днем ​​больше 3х и т. д.

0 голосов
/ 19 ноября 2009

Нет, это невозможно.

Кстати, вам нужно заключить подчеркивание в скобки, потому что это означает любой символ.

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