6
votes

Convertir une chaîne séparée par des virgules sur une liste

Je veux transmettre une liste de Int's (virgule séparée) qui est un champ de ma table

IE. 1234, 2345, 3456, 4567 P> blockQuote>

à mon dans la clause code> dans où code>. Mais la liste est une chaîne ( varchar code>) et je comparais à un champ INT. Existe-t-il un moyen de convertir la liste à la liste des intentes? P>

Enterprise_id code> est int code> de
Le chemin est un champ dans la table qui est une chaîne séparée par des virgules p>

IE. 1234, 2345, 3456, 4567 P>

SELECT *
FROM tbl_Enterprise
WHERE Enterprise_ID IN ( Path )


5 commentaires

Avez-vous un contrôle sur la structure de la base de données? Une liste des entiers séparés par des virgules dans une colonne est une indication forte que votre structure de base de données est fausse.


@Mattgibson Je pense que le problème réel est ce qu'il passe comme paramètre à la requête (liste Varcharne de chiffres séparés par des virgules), pas la structure de base de données.


@Radugheorghiu stocker plusieurs valeurs dans une colonne est un problème de la structure.


@Kermit OP n'a rien mentionné sur plusieurs valeurs stockées dans une seule colonne (que je suis d'accord, est un problème de la structure) - "mais la liste est une chaîne (varchar) et je comparais à un champ INT "


@Radugheorghiu Je vois votre interprétation. Je pense que tu as raison!


5 Réponses :


5
votes

Vous pouvez utiliser la fonction Split_Part en Vertica pour diviser la liste séparée des virgules en lignes et insérez-les dans une table TEMP. Utilisez une requête quelque chose comme ça pour atteindre votre objectif:

dbadmin=> SELECT SPLIT_PART('JIM|TOM|PATRICK|PENG|MARK|BRIAN', '|', row_num) "User Names"
dbadmin->   FROM (SELECT ROW_NUMBER() OVER () AS row_num
dbadmin(>           FROM tables) row_nums
dbadmin->  WHERE SPLIT_PART('JIM|TOM|PATRICK|PENG|MARK|BRIAN', '|', row_num) <> '';
 User Names
------------
 JIM
 TOM
 PATRICK
 PENG
 MARK
 BRIAN
(6 rows)


2 commentaires

Merci pour votre suggestion, mais Split_Part est utilisé pour obtenir une partie particulière de la chaîne. Comment puis-je utiliser Split_Part pour obtenir tous les identifiants séparés par une virgule dans des lignes?


J'ai ajouté un exemple de division de la chaîne dans des lignes à l'aide de Split_Part. Veuillez le modifier en fonction de votre utilisation. J'espère que cela t'aides!!



-3
votes

La concaténation de la chaîne est une tâche lourde, alors je vous proposerais de l'éviter. Puisque vous avez décidé de les sauvegarder comme une chaîne et de ne pas créer de tables "parents-enfant", je vous propose de les sauvegarder de cette façon, 1234 2345 3456 4567, (ajoutez A, au début et à la fin de votre valeur et couper tous les espaces).

Ensuite, vous pouvez facilement rechercher avec SQL, par exemple: xxx


0 commentaires

3
votes

Je considérerais ces deux solutions comme anti-motifs et je recommanderais de les tester pour des performances.

La première méthode utilise des fonctions qui viennent dans le package Table Flex. p> xxx pré>

La deuxième méthode utilise des fonctions fournies dans le package d'index de texte. P>

SELECT words::INT AS var1 
FROM (
    SELECT TxtIndex.StringTokenizerDelim('1234, 2345, 3456, 4567',',') 
           OVER() AS (words, input_string)
) AS T
WHERE REGEXP_SUBSTR(words, '\d+',1) IS NOT NULL;
 var1 
------
 1234
 2345
 3456
 4567
(4 rows)


0 commentaires

0
votes

Version légèrement améliorée de la solution suggérée par ABNAY:

SELECT SPLIT_PART('JIM|TOM|PATRICK|PENG|MARK|BRIAN|AAA', '|', row_num) "User Names"
FROM (SELECT ROW_NUMBER() OVER () AS row_num FROM columns) row_nums
WHERE  REGEXP_COUNT('JIM|TOM|PATRICK|PENG|MARK|BRIAN|AAA', '\|') + 2 > row_num


0 commentaires

0
votes

Pourquoi ne pas utiliser Find_in_set xxx

de tbl_enterprise Où Find_in_set (Enterprise_id, Chemin)


0 commentaires