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 Réponses :
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)
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!!
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: p>
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> 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)
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
Pourquoi ne pas utiliser Find_in_set de tbl_enterprise
Où Find_in_set (Enterprise_id, Chemin) P> P>
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 " code>
@Radugheorghiu Je vois votre interprétation. Je pense que tu as raison!