CHARINDEX() ou LIKE

Source: http://www.mssqltips.com/sqlservertip/1654/finding-a-string-value-in-a-s...

Comparaison fonction T-SQL CHARINDEX() et LIKE pour rechercher une chaine de texte "tosearch" dans des champs.

Son client avait besoin de remonter des infos dans 2 cas: la valeur du champs commence par "tosearch" ou "tosearch" est en début de mot (précédé d'un espace) - voir 1ere paragraphe de "solution" pour la demande du client : avec tosearch="B" et du texte tq "Bone Mass", "Thumb Pain", et "Tumor, Benign" on souhaite récupérér les chaines 1 et 3 (et non Thumb car pas d'espace avant le b mais m).

Son exemple commence par créer 2 tables ex: #ProductChild et #ProductParent - voir PJ " mysqltips1-crea.txt" pour le .sql. En voici l'affichage:

Ex de données
SELECT ID, Item 
FROM ##ProductParent
ORDER BY ID
SELECT ID, FKID, ChildDescription
FROM ##ProductChild
ORDER BY ID
ID      Item
10  SQL Server
20  Non-SQL Server
ID FKID  Child description
1  10      SQL Server
2  20      MySQL
3  30      Oracle
4  10      SQL Server 2000

 

On cherche les lignes dans ProductChild où "Child description" commence par SQL ou a un mot qui commence par SQL

Avec CHARINDEX()

Cette fonction a 3 paramètres: la valeur que l'on recherche, le champs om on cherche cette valeur et la position du début dans le champs.
La ligne avec le LIKE est pour le cas où la description commence par SQL.
Pour le mot commencant par SQL: '' + @searchstring , C.ChildDescription , 1) > 0 - l'espace du début élimine l'ex "Thumb".

Voir la PJ mais en voici un extrait:

SELECT @searchstring 'SQL'
SELECT @lensearch LEN(@searchstring)

SELECT DISTINCT P.IDP.Item
FROM ##ProductParent INNER JOIN ##ProductChild ON P.ID C.FKID
WHERE 
   
C.ChildDescription LIKE @searchstring '%'
   OR
   
CHARINDEX(' ' @searchstringC.ChildDescription1) > 0
ORDER BY P.ID

Avec un LIKE

On peux aussi ajouter un espace et '%' (wildcard) avec un LIKE.

SELECT DISTINCT P.IDP.Item 
FROM ##ProductParent INNER JOIN ##ProductChild ON P.ID C.FKID 
WHERE 
   
C.ChildDescription LIKE @searchstring '%'
   
OR 
   
C.ChildDescription LIKE '% ' @searchstring '%'
ORDER BY P.ID 


CREATE PROCEDURE uspSearchWord @searchstring VARCHAR(100AS
SELECT DISTINCT 
P.IDP.Item 
FROM ##ProductParent INNER JOIN ##ProductChild ON P.ID C.FKID 
WHERE 
   
C.ChildDescription LIKE @searchstring '%'
   
OR 
   
C.ChildDescription LIKE '% ' @searchstring '%'
ORDER BY 
P.ID 
 

doc: