2011-01-31 11 views
10

Devo filtrare i record in base ad una corrispondenza del testo nella colonna nvarchar (1000). La tabella ha più di 400.000 record e cresce. Per ora, sto usando come condizione: -Come utilizzare la condizione come con più valori in sql server 2005?

SELECT 
    * 
FROM 
    table_01 
WHERE 
    Text like '%A1%' 
    OR Text like '%B1%' 
    OR Text like '%C1%' 
    OR Text like '%D1%' 

C'è qualche lavoro preferito in giro?

+4

Tu ** sai ** che l'uso di un'operazione simile a "% A1%" 'disabiliterà definitivamente qualsiasi utilizzo dell'indice e determinerà quindi una ** scansione completa della tabella ** ** ogni volta ... –

risposta

0

Se è possibile creare un FULLTEXT INDEX su quella colonna della tabella (che presuppone un sacco di ricerche su prestazioni e spazio), probabilmente si noterà un notevole miglioramento delle prestazioni sulla corrispondenza del testo. Puoi andare a questo link per vedere cosa FULLTEXT SEARCH è e questo link per vedere come creare un FULLTEXT INDEX.

+0

Keep in bada che l'indicizzazione del testo completo è basata su parole mentre LIKE sta cercando un modello di carattere all'interno di una stringa. Come esempio concreto, una ricerca in full text per "lavoro" non troverebbe la parola in "sovraccarico di lavoro", ma una clausola LIKE lo farà. –

8
SELECT 
    * 
FROM 
    table_01 
WHERE 
    Text like '%[A-Z]1%' 

Questo controllerà se i testi contiene A1, B1, C1, D1, ...

riferimento all'utilizzo del Like Condition in SQL Server

+5

Ho la sensazione che tu abbia preso il codice di esempio dato un po 'troppo alla lettera. –

+0

@Joe Stefanelli ... Forse ho ma tutto il PO menzionato era una "soluzione alternativa" Questo è chiaramente un modo. Se si trattasse di prestazioni, gli Indici di FullText potrebbero essere utili. –

4

Date un'occhiata al COME su msdn.

È possibile ridurre i filtri numerici combinando più dettagli in una singola clausola LIKE.

SELECT 
    * 
FROM 
    table_01 
WHERE 
    Text like '%[ABCD]1%' 
+5

Ho la sensazione che tu abbia preso il codice di esempio dato un po 'troppo alla lettera. –

+1

Non proprio. La query fornita farebbe esattamente la stessa cosa dell'originale. Il collegamento MSDN spiega perché. – msms

+1

Potrei sbagliarmi, ma ho il sospetto che A1, B1, ecc. Siano solo falsi segnaposti per le stringhe reali che vengono cercate. –

5

È possibile provare il seguente se si conosce la posizione esatta della stringa sub:

SELECT 
    * 
FROM 
    table_01 
WHERE 
    SUBSTRING(Text,1,2) in ('B1','C1','D1') 
+0

Dopo alcune ricerche, LIKE() sembra essere più performante di SUBSTRING(). – mbrownnyc

0

avevo bisogno di fare questo in modo da poter permettere a due database diversi in un filtro per la colonna DatabaseName in un modello di traccia di SQL Server Profiler.

Tutto quello che puoi fare è compilare il corpo di una clausola Like.

Utilizzando il riferimento in John Hartscock's answer, ho scoperto che la clausola like utilizza una sorta di modello di regex limitato.

Per lo scenario dell'OP, MSMS has the solution.

Supponendo che voglio database Abcone, ABCTwo e ABCThree, vengo con ciò che è essenzialmente whitelist indipendenti per ogni personaggio:

Like ABC[OTT][NWH][EOR]% 

che è facilmente estendibile a qualsiasi insieme di stringhe. Non sarà corazzato, l'ultimo modello corrisponderebbe anche a ABCOwe, ABCTnr o ABCOneHippotamus, ma se stai filtrando un insieme limitato di valori possibili ci sono buone possibilità che tu possa farlo funzionare.

In alternativa, è possibile utilizzare l'operatore [^] per presentare una lista nera di caratteri non accettabili.

Problemi correlati