J'ai une table avec les textes suivants et le mot clé que je recherche est 'search'.so j'ai écrit une requête
SELECT [ID]
,[TextValue]
FROM
[dbo].[SearchLike]
WHERE
[TextValue] LIKE '%Search%'
Q.1 Comment puis-je modifier la requête afin que seuls les enregistrements ayant une "recherche" dans le texte soit renvoyé et il ne faut pas prendre "lSearch". I.e Selon l'image, trois premiers enregistrements seulement doivent être retournés.
Une ligne unique comme la recherche:
WHERE
' ' + [TextValue] + ' ' LIKE '%[.,;:() ]Search[.,;:() ]%'
/* [] contains list of allowable characters, adding spaces around
[TextValue] removes need to have multiple OR [TextValue] LIKE */
Sans rembourrage, vous devrez gérer spécifiquement la chaîne d'apparaître au début/fin de la chaîne:
WHERE
[TextValue] LIKE '%Search%' --middle
OR
[TextValue] LIKE 'Search%' --start
OR
[TextValue] LIKE '%Search' --end
Edit2, pour les puristes du texte complet
CREATE FULLTEXT INDEX
sur les états MSDN pour l'option Auto (la valeur par défaut)
Bien que les modifications soient automatiquement propagées, ces modifications pourraient ne pas être reflétées immédiatement dans l'indice de texte intégral.
Donc, il peut ne pas donner de résultats corrects. Mais quelques secondes plus tard, il le fera.
De plus, pour quelques rangées de 10 000 rangs, il effectuera de manière adéquate: elle échoue O (n). J'utilise similaire sur une table avec environ 25 000 rangées, mais les utilisateurs savent qu'il fonctionnera mal s'ils recherchent de cette façon (c'est sur une page "avancée"). Je gagne dans le compromis en gérant un index de texte complet
La recherche de texte complet n'est pas la Solution correcte, c'est une Option
Note: Expérience m'a montré que l'indexation complète dutext dans SQL Server a de graves implications de performance, c'est-à-dire: uniquement mettre en œuvre si vous avez vraiment besoin de et vous savez ce que vous faites! (@Andrew bickerton)
Si votre table aura une quantité non triviale de lignes, vous voudrez peut-être essayer un index FullText. Ce sera beaucoup plus rapide et correspondra juste sur le mot exact.
CREATE FULLTEXT CATALOG <catalog_name> AS DEFAULT;
CREATE FULLTEXT INDEX ON [dbo].[SearchLike](TextValue)
KEY INDEX pk_id; --requires the existing of a PK or UQ index with this name on this table
Maintenant, recherchez votre texte:
SELECT [ID]
,[TextValue]
FROM
[dbo].[SearchLike]
WHERE
CONTAINS([TextValue], 'Search')
Plus sur:
Je ne sais pas si SQL Server prend en charge \b
Dans Regexes (match sur la limite de mot). Et vous devrez créer une fonction définie par l'utilisateur pour permettre la correspondance de RegEx en premier lie , mais si cela le fait, vous pouvez correspondre à:
\bSearch\b
Si ce n'est pas le cas, vous devriez toujours être capable de faire correspondre:
(^| )Search( |$)