2009-10-02 6 views
1

Ok, donc je travaille sur une recherche de base SPROC. L'un des paramètres est un texte de recherche (ce sera le test de l'utilisateur entre, les mots séparés par des espaces, etc.)Requête de recherche SQL 'simple'

Maintenant, tout ce dont j'ai besoin est de rechercher ces mots sur une seule colonne dans un tableau, mais je Je veux qu'il ait TOUS les mots-clés qui ont été entrés (pour l'instant tout ce que je peux faire est si 1 d'entre eux est là)

Y a-t-il une commande SQL spéciale qui me permet de faire cela?

+0

Le problème avec ces 2 réponses sont les termes de recherche sont toujours vont être différentes. Je peux renverser les mots dans une table mais je ne sais toujours pas trop comment les rechercher tous parce que je peux faire un IN sur cette table mais c'est toujours le même problème ... – dkarzon

Répondre

2

Vous pouvez essayer quelque chose comme ça

vérifier les occurences des mots nécessaires et comparer au nombre de mots séparés.

Tout problème que je prévois est correspond aux mots partiels, mais cela pourrait vous aider à démarrer

/* 
ALTER FUNCTION [dbo].[SplitString] 
(
     @String VARCHAR(8000) , 
     @Delimiter VARCHAR(10) 
) 
RETURNS @RetTable TABLE(
     String varchar(1000) 
) 
AS 
BEGIN 
    DECLARE @i INT , 
      @j INT 
    SELECT @i = 1 
    WHILE @i <= LEN(@String) 
    BEGIN 
     SELECT @j = CHARINDEX(@Delimiter, @String, @i) 
     IF @j = 0 
     BEGIN 
      SELECT @j = LEN(@String) + 1 
     END 
     INSERT @RetTable SELECT SUBSTRING(@String, @i, @j - @i) 
     SELECT @i = @j + LEN(@Delimiter) 
    END 
    RETURN 
END 
*/ 

DECLARE @SearchString VARCHAR(MAX) 

SELECT @SearchString = 'your,of' 

DECLARE @SearchStringTable TABLE(
     Words VARCHAR(MAX) 
) 

DECLARE @TABLE TABLE(
     Col VARCHAR(MAX) 
) 

INSERT INTO @TABLE (Col) 
SELECT 
'On the Insert tab, the galleries include items that are designed to coordinate with the overall look of your document.' 
INSERT INTO @TABLE (Col) 
SELECT 
'You can use these galleries to insert tables, headers, footers, lists, cover pages, and other document building blocks.' 
INSERT INTO @TABLE (Col) 
SELECT 
'When you create pictures, charts, or diagrams, they also coordinate with your current document look.' 

INSERT INTO @SearchStringTable (Words) SELECT * FROM dbo.SplitString(@SearchString,',') 

SELECT t.Col, 
     COUNT(1) AS Number 
FROM @TABLE t, 
     @SearchStringTable s 
WHERE CHARINDEX(s.Words,t.Col) > 0 
GROUP BY t.Col 
HAVING COUNT(1) = (SELECT COUNT(1) FROM @SearchStringTable) 
+0

qui semble fonctionner plutôt bien! Merci! – dkarzon

0

Vous devez diviser le @SEARCH_TEXT en mots et idéalement le stocker dans une table temporaire @FILTER_TABLE avec une colonne WORD contenant les mots. Vous pouvez google pour "sql comma split ...", mais la réponse à this question pourrait être utile. This est également intéressant.

Ensuite, il suffit d'utiliser JOIN dans votre requête pour filtrer les lignes. La requête la plus simple alors que retournerait tous les matchs seraient:

SELECT t.* 
     f.WORD 
FROM MyTable t 
JOIN @FILTER_TABLE f 
    ON t.MyColumn = f.WORD --// = or LIKE operator 

Mais si vous fournissez un exemple de vos données et résultats attendus, les gens pourrait être plus utile.