2013-02-21 23 views

答えて

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

+0

私はそれを試してみましょう。 – Paparazzi

+0

問題を手にして私は実際にこれを使用することはできませんが、それは記載された質問に対する答えです。 – Paparazzi

-3

いいえ。

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

%文字はしないだろう場合は、ORをする必要があります。それは句の余分な部分ですので、それはあまりクリーンではありませんが、最初にLIKEを使用すると、とにかく効率が悪くなります。経験則が重要であるならば、経験則は可能ならLIKEを避けてください。

+2

これも 'system22222'と一致するためです。 –

+0

私の答えを更新しました。 – ty733420

+0

どうすればいいですか? LIKEなし 'system_'は1文字のワイルドカードではなく、リテラルとして評価されます。 – Paparazzi

0

ひどく非効率で、私はAndriy's answerが好きですが、ワイルドカードを使用して長さを比較することもできます。

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

OKは正しい答えを返します。しかし、 'system_'や 'word'のような[system]のような[word] – Paparazzi

関連する問題