2015-09-23 17 views
6

Ho bisogno di recuperare le righe dal mio tavolo, con un campo a partire da un certo valore:Come posso rendere questa query sargable?

Attualmente sto facendo così con una semplice query come questa:

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

Tuttavia, ho imparato che A.FIELD a volte contiene un numero variabile di spazi vuoti prima di "WORD".

Ovviamente, potrei riscrivere la query con un altro carattere jolly, ma ciò renderebbe non-sargable e rallentare un po '(questa query viene eseguita su una tabella abbastanza grande e deve essere il più efficiente possibile) .

C'è un modo per scrivere una query sargabile per risolvere questo problema?

+1

Soluzione facile, disinfettare i dati e liberarsi degli spazi principali. SQL non si preoccupa degli spazi finali, ma gli spazi guida sicuramente contano. –

+0

Sono con @KrisGruttemeyer sulla pulizia dei dati. Tuttavia, puoi semplicemente tagliare la colonna? LTRIM (A.Field) – JBond

+0

@KrisGruttemeyer In realtà l'ho già fatto, ma ero curioso di sapere se c'era un modo per riscrivere la query nel caso in cui non avrei potuto pulire i dati per qualsiasi cosa ragionare. – Mansfield

risposta

-4

E a proposito di ltrim?

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

Bene, questo non corrisponde al 'C'è un modo per scrivere una query sargabile per risolvere questo problema?' Requisito – Lamak

+0

Vedo che vuoi assicurarti che gli indici siano usati. Penso che dovresti pulire i dati. SQL è ancora veloce. È possibile trovare tale indice o meno, la query verrà eseguita in modo tempestivo. – sean

6

Se non è possibile pulire i dati per qualsiasi motivo, una possibilità è quella di aggiungere una colonna calcolata al vostro tavolo che rifila tutti gli spazi iniziali e finali:

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

e indice la colonna calcolata :

CREATE INDEX IX_YourTable_TrimmedYourColumn 
    ON YourTable (TrimmedYourColumn) 

E ora cercare quella colonna, invece:

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

In SQL Server non è presente la funzione 'TRIM', è necessario utilizzare' LTRIM (RTRIM (YourColumn)) '. – lad2025

+1

@ lad2025 Certo, avrei dovuto ricordarmelo! – DavidG

Problemi correlati