0
votes

Comme opérateur avec des valeurs séparées par des virgules dans SQL Server

Par exemple, c'est ma table d'origine xxx pré>

Entrez la description de l'image ici p>

Chaque fois que mes valeurs séparées par des virgules sont correctes chemin, alors j'ai eu mon résultat basé sur ma table d'origine. p>

Voir ceci ci-dessous Image: P>

DECLARE @Test VARCHAR(100)
SET @Test='Narcotic,General'


SELECT id, testName FROM tblTest1 a 
WHERE isnull(a.testName,'') Like (CASE WHEN isnull(@Test,'') = '' THEN isnull(a.testName,'') 
ELSE '%'+@Test+'%' END)


7 commentaires

S'il vous plaît ne postez pas de données ni de code a une image. Les données et le code (SQL) sont du texte et doivent être affichés sous forme de texte . Idéalement, les données doivent être fournies des instructions DDL et DML, cependant, le fournissant autrement sous forme de texte formaté au format . Veuillez prendre le temps de mettre à jour votre message afin que nous puissions consommer votre SQL et vos données. Merci.


Un autre bon exemple pourquoi stocker des valeurs séparées par des virgules dans une seule ligne est une idée vraiment, vraiment mauvaise idée.


Corrigez votre modèle de données! Ne stockez pas plusieurs valeurs dans une seule colonne, à l'aide d'une chaîne délimitée. Utilisez une table de jonction / association.


@a_horse_with_no_name .... Je sais mais ... c'est l'exigence de l'entreprise


J'ai du mal à croire qu'une entreprise vous exige Store les données d'un format dénormalisé. Peut-être qu'ils en ont besoin affichés comme liste délimitée, mais les valeurs d'affichage et stockées peuvent (et sont souvent) très différentes. Vous pourriez être tenu d'afficher toutes les dates de votre application dans le format jj mmm aaaa aaaa (c.-à-d. '07 août 2019 '), mais vous ne stockeriez pas cette valeur dans votre base de données; Vous utiliseriez une date qui le stockerait comme une valeur binaire. Vous utiliseriez votre application pour contrôler le format de la valeur. La même chose devrait être vraie ici.


Si c'est vraiment en dehors de votre contrôle, votre seule option consiste à normaliser les données à la volée (tout cela), avec une fonction de fractionnement de chaîne, qui va être SloooWow. Mieux vaut repousser quiconque fournit des données comme celle-ci.


Général, narcotique (avec un espace) ne correspondra pas aux données Général, narcotique (sans espace). Vous devez corriger votre schéma.


3 Réponses :


0
votes

Vous pouvez l'utiliser.

Puisque vous utilisez SQL 2005, vous devez d'abord créer une fonction pour diviser votre valeur séparée par des virgules en ligne comme: p>

DECLARE @Test VARCHAR(100)
SET @Test='Narcotic,General'

select * from (
select items from Split(@test, ',')) as d where d.value like 'na%'


5 commentaires

Cela fait supposons l'OP utilise SQL Server 2016+.


J'utilise .... SQL Server 2005 ... ??? .... Donc, cette requête fonctionnera pour moi ... ou pas ?? ...


Est-ce que cela vous est possible de créer une nouvelle fonction dans votre base de données.


SQL Server 2005 a été complètement hors de l'appui depuis plus de 3 ans maintenant, @akhileShsingh. Si vous utilisez vraiment une telle technologie datée, vous devez faire savoir aux gens.


@Darkrob ... je ne reçois pas cette ligne .... S'il vous plaît pouvez-vous m'expliquer ... Sélectionnez * à partir de (Sélectionnez la valeur de Split (@Test, ',')) AS D D.Value comme 'Na% "



1
votes

Vous pouvez essayer est null et ou condition xxx


0 commentaires

0
votes
CREATE TABLE #temp
(
 varData VARCHAR(50)
 )

 INSERT INTO #temp
 (
     varData
 )
 VALUES
 ('General,Narcotic'),
 ( 'General,ABC')

 DECLARE @Data VARCHAR(50) ='Narcotic,General'
 DECLARE @Query VARCHAR(MAX)=''

 SELECT @Query+='varData LIKE ''%''+'''+value+'''+''%'' AND ' 
 FROM STRING_SPLIT(@Data,',')

 SET @Query='SELECT * FROM #temp WHERE '+ SUBSTRING(@Query,1,LEN(@Query)-4)
 EXEC(@Query)

 DROP TABLE #temp

3 commentaires

Salut! Les réponses de code sans contexte ne sont généralement découragées au débordement de la pile. Veuillez ajouter quelques informations supplémentaires, y compris pourquoi et comment cela répond à la question de l'OP.


Cela ne gérera pas le cas où vous avez des valeurs similaires, c'est-à-dire une sous-chaîne de l'autre par exemple. Carte et Cardigan - Le cardigan serait ramassé lors de la recherche de carte comme étant aussi comme «% de carte%». Pour éviter cela, vous devez également faire le fractionnement de la chaîne sur toute la table.


string_split a été ajouté dans SQL Server 2016, mais cette question est étiquetée 2005 - cela ne fonctionnera pas