2011-10-07 14 views
8

Sto eseguendo due query su un tavolo.SQL: Like vs Contains - Diversi risultati

SELECT MSDS FROM dbo.MSDSSearch3 WHERE CONTAINS(MSDS, 'STYCAST') 

E

SELECT MSDS FROM dbo.MSDSSearch3 WHERE MSDS like '%STYCAST%' 

La prima query restituirà

'STYCAST 50300 LV' 

E il secondo tornerà

'STYCAST 50300 LV' 
'STYCAST 2851 BLACK' 

Qualcuno sa perché simili sarebbero tornati più valori di il contiene? C'è un problema con il modo in cui sono in esecuzione contiene? Grazie in anticipo.

+0

Quale versione di SQL Server? Se nel 2008 è possibile ottenere una certa visibilità nel parser con 'SELECT * FROM sys.dm_fts_parser ('" STYCAST 2851 BLACK "", 1033, 0,0) 'Non riesco a vedere alcun motivo per cui le stringhe verrebbero trattate in modo diverso. –

+3

Domanda interessante, sei sicuro che entrambi i valori siano esattamente gli stessi? come in nessun carattere di spaziatura iniziale/finale. Questo potrebbe causare questo problema in quanto CONTAINS corrisponderebbe esattamente al tuo testo, mentre il LIKE corrisponderebbe al tuo testo + qualsiasi lato di esso – Purplegoldfish

+11

Sembra un caso in cui il tuo catalogo di testo completo non è aggiornato. Potresti provare a ricostruirlo con un [ALTER FULLTEXT CATALOG] (http://msdn.microsoft.com/en-us/library/ms176095.aspx). –

risposta

2

CONTAINS è una funzione completamente diversa, è una query basata su predicato per colonne full-text; non è una funzione per determinare se una colonna contiene una stringa in essa.

per la query è in esecuzione, è possibile utilizzare questo:

SELECT MSDS FROM dbo.MSDSSearch3 WHERE CONTAINS(MSDS, '"STYCAST*"') 

ci avete una ricerca di prefisso, invece di una ricerca simple_term come attualmente si dispone.

Maggiori dettagli: http://msdn.microsoft.com/en-us/library/ms187787.aspx


Forse nel modo in cui si utilizza il testo 'Stycast 2851 NERO' non cadere in risultati perché hanno più un carattere di 'Stycast 50300 LV', in modo da è una partita [7 di 17] contro una partita [7 di 16]. Non sono sicuro, ma questo potrebbe spiegare questo strano comportamento.

+0

Ho appena testato questa soluzione, con lo stesso risultato. SELECT MSDS FROM dbo.MSDSSearch3 WHERE CONTAINS (MSDS, '"STYCAST *"') Ancora restituito l'unico valore. – Corey

+0

Triste per leggerlo; Quindi dovrebbe essere un catalogo obsoleto, ma hai detto che lo hai già aggiornato. E 'molto strano. – daniloquio

+0

Cosa succede se si esegue questa operazione: SELECT MSDS FROM dbo.MSDSSearch3 WHERE CONTAINS (MSDS, 'STYCAST 2851 BLACK')? – daniloquio