2015-09-23 14 views
6

Ich muss mit Zeilen aus meiner Tabelle abzurufen aus einem Feld mit einem bestimmten Wert Start:Wie kann ich diese Abfrage sargable machen?

ich zur Zeit so mit einer einfachen Abfrage wie folgt vorgehen:

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

Allerdings habe ich gelernt, dass A.FIELD enthält manchmal eine variierende Anzahl von Leerzeichen vor "WORD".

Offensichtlich könnte ich die Abfrage mit einem anderen Platzhalter neu schreiben, aber das würde es nicht sargable machen und es ein wenig verlangsamen (diese Abfrage läuft auf einer ziemlich großen Tabelle und muss so effizient wie möglich sein) .

Gibt es eine Möglichkeit, eine Sargable-Abfrage zu schreiben, um dieses Problem zu beheben?

+1

Einfache Lösung, bereinigen Sie Ihre Daten und entfernen Sie die führenden Bereiche. SQL interessiert nicht für abschließende Leerzeichen, aber führende Leerzeichen zählen definitiv. –

+0

Ich bin mit @KrisGruttemeyer auf die Bereinigung der Daten. Können Sie die Spalte jedoch einfach trimmen? LTRIM (A.Field) – JBond

+0

@KrisGruttemeyer Ich habe das schon gemacht, aber ich war neugierig, ob es eine Möglichkeit gibt, die Abfrage neu zu schreiben, für den Fall, dass ich die Daten nicht für irgendwas säubern könnte Grund. – Mansfield

Antwort

-4

Wie wäre es mit Ltrim?

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

Nun, dies stimmt nicht mit dem "Gibt es eine Möglichkeit, ich kann eine sargable Abfrage schreiben, um dieses Problem zu beheben?" Anforderung – Lamak

+0

Ich sehe Sie wollen sicherstellen, dass Indizes verwendet werden. Ich denke, Sie müssten die Daten bereinigen. SQL ist immer noch schnell. Sie können diesen Index finden oder nicht, Ihre Abfrage wird zeitnah ausgeführt. – sean

6

Wenn Sie die Daten nicht aus irgendeinem Grunde reinigen können, ist eine Option ist eine berechnete Spalte zu Ihrer Tabelle hinzuzufügen, die alle führenden und nachgestellten Leerzeichen trimmen:

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

Und Index der berechnete Spalte :

CREATE INDEX IX_YourTable_TrimmedYourColumn 
    ON YourTable (TrimmedYourColumn) 

Und nun diese Spalte suchen statt:

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

In SQL Server gibt es keine 'TRIM'-Funktion, stattdessen müssen Sie' LTRIM (RTRIM (YourColumn)) '' verwenden. – lad2025

+1

@ lad2025 Natürlich hätte ich mich daran erinnern sollen! – DavidG

Verwandte Themen