Подстановочный знак, соответствующий одному или нулю символов

есть ли короткая рука для этого?
Есть ли подстановочный знак, который соответствует any или null?
Еще скажу, что это матч на ноль или один.

select [id], [word] from [FTSwordDef]
 where [word] like 'system_'
    or [word] like 'system'

3 ответов


Да, есть более короткий путь, но это, вероятно, сделает ваш запрос не-sargable (если это уже так):

WHERE word + ' ' LIKE 'system_'

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

так, например, все следующее привело бы к true:

(1) 'system ' LIKE 'system_'
(2) 'systemA' LIKE 'system_'
(3) 'systemA ' LIKE 'system_'

в (1) пробел соответствует _ в строке шаблона. В (2), это A, что соответствует _. В (3), также A в то время как пространство игнорируется.

вот небольшой демо, чтобы проиллюстрировать это: http://sqlfiddle.com/#!3/d41d8/9521.


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

select [id], [word] from [FTSwordDef]
  where [word] like 'system%'
    and LEN([word]) <= LEN('system%')

Неа.

http://msdn.microsoft.com/en-us/library/ms179859.aspx

Если символ процента не подходит, вам понадобится OR. Это дополнительная часть к предложению, поэтому да, это менее чисто, но использование LIKE в первую очередь вводит неэффективность. Эмпирическое правило: избегайте, если это возможно, если производительность вызывает беспокойство.