2015-09-23 12 views
6

私は特定の値で始まるフィールド外で私のテーブルから行を取得する必要があります。このクエリをsargableにするにはどうすればよいですか?

私は現在、このような単純なクエリでそうやっている:

SELECT A.ID FROM SCHEMA.TABLE A WHERE A.FIELD NOT LIKE 'WORD%' 

しかし、私はあることを学びましたA.FIELDには、「WORD」の前にさまざまな数の空白が含まれることがあります。

明らかに、私は別のワイルドカードでクエリを書き直すことができますが、それは非sargableになり、公正なビットを遅くします(このクエリはかなり大きなテーブルで実行され、できるだけ効率的でなければなりません) 。

私はこの問題を解決するために検索引数可能クエリを書くことができる方法はありますか?

+1

簡単な解決策は、あなたのデータを浄化し、先頭のスペースを取り除くことです。 SQLは末尾のスペースは気にしませんが、先頭のスペースは確実にカウントされます。 –

+0

私はデータをクレンジングする際に@KrisGruttemeyerと一緒にいます。しかし、列をトリミングできますか? LTRIM(A.Field)私は実際にすでにことをやった@KrisGruttemeyer – JBond

+0

が、私は何のためにデータをきれいにすることはできなかったでしょう場合には、私は、クエリを書き直すことができな方法があったかどうかについて興味がありました理由。 – Mansfield

答えて

-4

ltrimについて

SELECT A.ID FROM SCHEMA.TABLE A WHERE ltrim(A.FIELD) NOT LIKE 'WORD%' 
+6

これは、「この問題を解決するためにsargableクエリを書くことはできますか?」という要求と一致しません。要件 – Lamak

+0

インデックスが使用されていることを確認したいのですが。私はあなたがデータをきれいにしなければならないと思います。 SQLはまだ高速です。インデックスが見つかるかもしれませんが、クエリは適時に実行されます。 – sean

6

あなたが何らかの理由でデータをきれいにすることができない場合は、1つのオプションすべての先頭と末尾のスペースをトリムあなたのテーブルに計算列を追加することです:

ALTER TABLE YourTable 
    ADD TrimmedYourColumn as (RTRIM(LTRIM(YourColumn))) 

とインデックス計算列:今

CREATE INDEX IX_YourTable_TrimmedYourColumn 
    ON YourTable (TrimmedYourColumn) 

、代わりにその列を検索:

SELECT A.ID FROM YourTable A WHERE TrimmedYourColumn NOT LIKE 'WORD%' 
+1

SQL Serverでは 'TRIM'機能はありません。代わりに' LTRIM(RTRIM(YourColumn)) 'を使う必要があります。 – lad2025

+1

@ lad2025もちろん、私はそれを覚えていたはずです! – DavidG

関連する問題