2011-10-07 7 views
8

テーブルに対して2つのクエリを実行しています。SQL:Like Contains - 異なる結果

SELECT MSDS FROM dbo.MSDSSearch3 WHERE CONTAINS(MSDS, 'STYCAST') 

そして

SELECT MSDS FROM dbo.MSDSSearch3 WHERE MSDS like '%STYCAST%' 

最初のクエリは、

'STYCAST 50300 LV' 

を返します。そして第二には、

'STYCAST 50300 LV' 
'STYCAST 2851 BLACK' 

を返しますように複数の値以上を返す理由を誰もが知っています含まれていますか?私がどのように実行しているかに問題はありますか?前もって感謝します。

+0

SQL Serverののバージョンは? 2008年の場合、 'SELECT * FROM sys.dm_fts_parser( '" STYCAST 2851 BLACK "'、1033、0,0)を使ってパーサーに可視性を与えることができます。なぜ文字列が異なって扱われるのかはわかりません。 –

+3

面白い質問ですが、両方の値がまったく同じであることを確認してください。先頭/末尾の空白文字がない場合と同様です。 CONTAINSがあなたのテキストに正確にマッチするのに対して、LIKEはあなたのテキストにマッチしますが、どちらの側にも一致します。 – Purplegoldfish

+11

あなたのフルテキストカタログが古くなっているような感じです。 [ALTER FULLTEXT CATALOG](http://msdn.microsoft.com/en-us/library/ms176095.aspx)を使用して再構築することをお勧めします。 –

答えて

2

CONTAINSは完全に異なる関数です。これは、フルテキスト列の述語ベースのクエリです。列に文字列が含まれているかどうかを判断する関数ではありません。あなたが実行しているクエリのために

、あなたはこれを使用することができます:あなたが現在持っているよう

があり
SELECT MSDS FROM dbo.MSDSSearch3 WHERE CONTAINS(MSDS, '"STYCAST*"') 

あなたの代わりにsimple_term検索の、前方一致検索を持っています。

詳細:あなたがそう、それはSTYCAST 50300 LV 'より1以上の文字を持っているので、テキスト「STYCAST 2851 BLACK」の結果に分類されない、それを使用している方法で、たぶんhttp://msdn.microsoft.com/en-us/library/ms187787.aspx


それは[7試合対]対[7試合対16試合]です。私は確信していませんが、それはこの奇妙な行動を説明することができます。

+0

この解決策をテストしたところ、同じ結果が得られました。 dbo.MSDSSearch3からMSDSを選択してください(MSDS、 '"STYCAST *"') まだ値が1つ返されています。 – Corey

+0

それを読んで悲しい;それから古いカタログでなければならないが、あなたは既にそれを更新したと言った。それは非常に奇妙です。 – daniloquio

+0

これを実行するとどうなりますか:SELECT MSDS FROM dbo.MSDSSearch3含まれています(MSDS、 'STYCAST 2851 BLACK')? – daniloquio