Blog de Portekoi : Programmation et Astuces

Programmation Cobol, Php, Asp, Java et DotNet…

[SQL Server] Rechercher une chaine de mots dans une table

Aujourd’hui, j’ai été confronté à cette demande :

D’un côté, j’ai une table avec deux colonnes : N° de Client | Nom – Prénom
Les données sont enregistrées de cette manière :

  • 0123456789 | Damien David Thomas
  • 1234512144 | Igor Bastien Guillaume
  • 9874125621 | Marc Patrick

De l’autre, une table avec une seule colonne : Nom – Prénom
Les données sont sous cette forme :

  • Damien
  • Patrick
  • Marc

Sous SQL Server, la fonction CHARINDEX() permet de faire un équivalent de « Strpos » pour PHP ou « InStr » pour ASP. Mais le problème est qu’elle s’arrête à la première occurrence trouvée.

Par exemple, si je fais un :

DECLARE _at_temp as varchar(50);
SET _at_temp = "Damien David Thomas";
Print SUB_STRING(_at_temp, 0, CHARINDEX(" ",rtrim(_at_temp) + " ")+1) //Enlever le '_' de sub_string. Je sais pas pourquoi mais WP n'aime pas

Le résultat sera :

Damien

La ligne devra donc être marquée.

Mais si je fais la même chose avec « Philippe Pierre Damien », la ligne ne sera pas marquée car Philippe n’est pas dans « Table_2 ».

Là est la difficulté : Il faut récupérer toutes les chaines de la colonne « Nom – Prénom » de « Table_1 » pour toutes les comparer.

Je n’ai pas su trouver une solution en SQL pur. Mais elle doit surement exister.

Voici mon résultat en utilisant les curseurs :

DECLARE @noms as Varchar(200);
DECLARE @temp_chr as Varchar(200);
DECLARE @temp_str as Varchar(200);
DECLARE @i as int;
DECLARE @No_Tiers as varchar(11);

SET @i = 0;

DECLARE MyCursor CURSOR
    FOR SELECT TOP 20 No_Tiers, NOM_COMPLET FROM Table_1;
OPEN MyCursor
FETCH NEXT FROM MyCursor
INTO @No_Tiers, @noms
WHILE @@FETCH_STATUS = 0
BEGIN
	SET @temp_chr = rtrim(ltrim(@noms))+  ' '
	
	Print 'Chaine de début : ' + @temp_chr + ' '
	
	SET @i = 0
	While(len(@temp_chr) > 0)
	BEGIN
		SET @i = @i + 1;
		SET @temp_str = SUB_STRING(@temp_chr, 0, CHARINDEX(' ',rtrim(@temp_chr) + ' ')+1)
		
		/*
		Mise à jour ici via No_Tiers. Exemple :
		Update Table_1 SET FLAG = (select top 1 noms from Table_2 where nom = rtrim(ltrim(@temp_str))
		And No_Tiers = @No_Tiers
		*/
		Print @temp_str
		SET @temp_chr = ltrim(rtrim(replace(@temp_chr , @temp_str, '')))
		
		If(@i >= 10)
			SET @temp_chr = ''
	END

	FETCH NEXT FROM MyCursor 
    INTO @No_Tiers, @noms
END 
CLOSE MyCursor;
DEALLOCATE MyCursor;

Les commentaires sont fermés.