2017-08-23 2 views
2

Il existe une liste de produits nommée attibute qui est de type liste qui contient de nombreux produits.Comment vérifier le compte dans l'attribut de liste en utilisant sql?

donc je veux tous les clients qui ont un seul produit dans la liste de produit:

customer productlist 

xxxx 12345, 
yyyy 12345,67891, 
zzzz 101112,52693,89563, 
aaaa 12536 



Expected Results : 

customer productlist 

xxxx 12345, 
aaaa 12536 

toute aide serait appréciée.

+6

Jamais, jamais stocker des données sous forme d'éléments séparés par des virgules. Cela ne vous causera que beaucoup de problèmes. – jarlh

+0

@jarlh merci pour la suggestion, mais pour le moment, il n'est pas possible pour moi de le faire.Je veux prendre la liste des données. – User2413

Répondre

0

Comme jarlh dit, si posible essayer de remodeler la base de données. Mais pour vous aider dans ce cas précis, vous pouvez faire quelque chose en utilisant une fonction définie par l'utilisateur et charindex() qui retournera le numéro de ',' se trouvant dans la colonne de la liste de produits. Cela va briser l'exécution car il devra s'exécuter une fois pour chaque ligne, et aura un impact important sur les performances, mais il fera le travail.

En regardant les données d'exemple, vous devez vérifier s'il y a un produit après la première occurence de « ».

0

Essayez cet exemple:

DECLARE @TAble TABLE 
       (
       customerName varchar(50), 
       productlist varchar(50) 
       ) 


       INSERT INTO @table VALUES ('xxxx', '12345') 
       INSERT INTO @table VALUES('yyyy', '12345,67891') 
       INSERT INTO @table VALUES('zzzz', '101112,52693,89563') 
       INSERT INTO @table VALUES('aaaa', '12536') 

       SELECT * FROM (
       select customerName,productlist,len(productlist)- len(replace(productlist,',',''))+1 as counts from @TAble 

       ) AS t 
       WHERE t.counts=1 

Output : 
     customerName productlist counts 
     xxxx    12345  1 
     aaaa    12536  1 
0

Utilisez REPLACE pour comparer la longueur de la chaîne d'origine avec la longueur de la chaîne avec tous les virgules supprimés, et REGEXP pour couvrir le cas où il y a une virgule de fin:

SELECT * 
FROM table_name 
WHERE length(productlist) - length(replace(productlist, ',', '') 
    - if(productlist REGEXP '.*, *$', 1, 0) /* Handles trailing commas */ 
    = 0; 
1

Je l'ai essayé dans MySQL et cela a fonctionné.

Essayez d'utiliser

select customer,productlist from table_name 
where instr(substr(productlist,1,length(productlist)-1),',')=0;