これは、T-SQL に基づくStack Exchange Data Explorerで遊んでいるときに繰り返し遭遇した問題です。
他の文字列の部分文字列として出現する場合を除いて、文字列を検索する方法は?
たとえばMyTable、列MyColに stringが含まれるテーブル内のすべてのレコードを選択し、stringの一部である s をfoo無視するにはどうすればよいでしょうか?foofoobar
迅速で汚い試みは次のようになります。
SELECT *
FROM MyTable
WHERE MyCol LIKE '%foo%'
AND MyCol NOT LIKE '%foobar%'
しかし、明らかにこれは一致しません。たとえばMyCol = 'not all foos are foobars'、私は一致させたいと思っています。
私が思いついた 1 つの解決策は、次のように、すべての出現箇所をfoobarダミー マーカー (の部分文字列ではないfoo) に置き換えてから、残りfooの sをチェックすることです。
SELECT *
FROM MyTable
WHERE REPLACE(MyCol, 'foobar', 'X') LIKE '%foo%'
REPLACE()これは機能しますが、テーブル内のすべてのレコードに対して実行する必要があるため、あまり効率的ではないと思います。(SEDE の場合、これは通常、Posts現在約 3,000 万行あるテーブルになります。)これを行うためのより良い方法はありますか?
(FWIW、この質問を促した実際のユースケースhttp://は、スキームプレフィックスを使用するがホストを指していない画像 URL を持つ SO 投稿を検索することでしたi.stack.imgur.com。)