2010-02-02 8 views
7

J'ai récuré différents sites MySQL dans l'espoir de trouver quelque chose qui va me permettre de tourner ceci:MySQL Split à utiliser dans « SELECT OÙ » déclaration

var parameters = "a,b,c,d"; // (Could be any number of comma-delimited values) 

Dans cette (en supposant que mes paramètres sont de plus en quelque sorte les valeurs que vous voyez dans le bloc IN):

SELECT * FROM mytable WHERE parametertype IN('a', 'b', 'c', 'd'); 

Mais je ne suis pas d'avoir beaucoup de succès! Le meilleur site que j'ai trouvé a été: dev.mysql.com, qui traite du découpage des chaînes basé sur un délimiteur (',' dans mon cas) bien qu'il n'ait pas trouvé de réponses ...

Quelqu'un sait-il de un bon moyen de diviser une chaîne délimitée par des virgules en un groupe de chaînes qui peut être utilisé dans ce contexte?

+0

vous voulez diviser la chaîne au moyen de mysql ou au moyen de C#? – tga

+0

Salut TGadfly, je vais passer quelque chose comme "'a', 'b', 'c'" dans SQL à partir de C# pour utiliser IN ('a', 'b', 'c') mais bien sûr (la loi du gazon) qui ne fonctionne pas! Merci pour votre correspondance! –

Répondre

6

Il ne peut pas avoir toute la flexibilité dont vous avez besoin, mais la fonction MySQL FIND_IN_SET pourrait être suffic ient. Il y a une limite stricte d'un maximum de 64 valeurs dans l'ensemble à comparer avec cependant.

Par exemple:

SELECT * 
FROM mytable 
WHERE FIND_IN_SET(parametertype, 'a,b,c,d') != 0 

Voici un exemple de l'utilisation d'un MySQL SET en ligne ('a, b, c, d') - son tri d'un ENUM. Il peut être un signe que quelque chose va de travers avec la normalisation du modèle de données si ceux-ci sont utilisés. Mais, ils peuvent être utiles pour éliminer une jointure, ou (comme dans ce cas) pour associer des informations complexes qui résident à l'extérieur de la base de données.

+0

Superbe réponse Martin! J'essayais d'appliquer une clause WHERE et de me mettre dans un vrai pétrin pour comprendre pourquoi ça ne fonctionnait pas! Merci beaucoup! –

0

vous pouvez utiliser SQL dynamique


delimiter //; 
create procedure tst() 
begin 
prepare stmp from 'INSERT INTO LOGG SELECT PFILE_Filename FROM PFILE_FILE'; 
execute stmp; 
deallocate prepare stmp; 
end// 
delimiter ;// 

que vous devez faire quelque chose comme ça

vous avez une partie de requête SQL

SELECT * FROM mytable WHERE parametertype IN(
vous joignez avec une chaîne passée en paramètre « « a » , « b », « c », « d » » en utilisant la fonction CONCAT par exemple en stmp comme ci-dessus, puis exécuter stmp

+0

TGadfly, qu'est-ce que ce PFILE? Désolé de vous harceler! –

+0

IT était juste un exemple d'exécution de chaîne comme un sql vous pouvez créer cette chaîne dynamiquement si vous passez la chaîne 'a', 'b' comme un paramètre mysql le reconnaît comme une chaîne, mais si vous le joignez avec une autre fin de chaîne alors appelez execute votre_string_name il sera reconnu comme un tableau de paramètres – tga

+0

Est-ce que cela ne me laisse pas ouvert à SQL-Injection? –