2010-02-02 4 views

Répondre

5

Vous pouvez le faire de deux façons:

  1. SQL Library
  2. Natively with REGEXP
+2

Ok, pouvez-vous être plus précis? –

+0

Mais l'idée avec Regex est géniale –

+4

Selon le lien, seules les réponses ne sont pas de bonnes pratiques. Je sais que c'est vieux mais je voulais quand même laisser ce commentaire dans l'espoir que tu reviendrais et que tu améliorerais cette réponse. D'autant plus que suivre ces deux liens ne dit pas immédiatement comment l'appliquer au problème, ils ne sont donc pas vraiment des bons liens pour répondre eux-mêmes à la question. (pour la discussion des réponses de lien seulement voir http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers) – Chris

3

Vous pouvez essayer cet exemple MySql. Avant de l'utiliser, placez des contrôles de sécurité de type (c'est-à-dire que check id est un entier, ou faites correspondre l'expression régulière avant l'insertion).

# BEGIN split statements ids 
DECLARE current_pos INT DEFAULT 1; 
DECLARE delim CHAR DEFAULT ','; 
DECLARE current CHAR DEFAULT ''; 
DECLARE current_id VARCHAR(100) DEFAULT '';; 
CREATE TEMPORARY TABLE ids (`id` VARCHAR(100)); 
split_ids: LOOP 
    SET current = MID(statement_ids, current_pos, 1); 
    IF (current_pos = LENGTH(statement_ids)) THEN 
    IF current != delim THEN SET current_id = CONCAT(current_id,current); END IF; 
    INSERT INTO ids(id) VALUES (current_id); 
    LEAVE split_ids; 
    END IF; 
    IF current = delim THEN 
    INSERT INTO ids(id) VALUES (current_id); 
    SET current_id = ''; 
    ELSE 
    SET current_id = CONCAT(current_id,current); 
    END IF; 
    SET current_pos = current_pos+1; 
END LOOP split_ids; 
# END split statement ids 

# to check ids are correct 
SELECT * FROM ids; 

# to use the ids: 
SELECT * FROM statements WHERE id IN (SELECT id FROM ids); 
2

OK, un peu plus "facile", mais de manière moins geeks pour des gens comme moi:

que vous avez une table 'combined_city_state' qui ressemble à:

'Chicago, Illinois' 

copie que 2 autres tables:

CREATE TABLE city LIKE combined_city_state; 
INSERT city SELECT * FROM combined_city_state; 

CREATE TABLE state LIKE combined_city_state; 
INSERT state SELECT * FROM combined_city_state; 

Vous avez maintenant 3 tables avec les mêmes données que 'combined_city_state'.

Installer cette fonction:

CREATE FUNCTION SPLIT_STR(
    x VARCHAR(255), 
    delim VARCHAR(12), 
    pos INT 
) 
RETURNS VARCHAR(255) 
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos), 
     LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1), 
     delim, ''); 

ensuite appliquer à chaque table pour supprimer l'index supplémentaire des données:

UPDATE firms 
SET city = (SELECT SPLIT_STR((city), ',', 1)); 


UPDATE firms 
SET state = (SELECT SPLIT_STR((state), ',', 2)); 

Cela vous laisse avec une colonne de quelques villes, l'un des tout états . Vous pouvez maintenant supprimer la colonne 'combined_city_state' d'origine si vous n'en avez plus besoin.

5

Vous pouvez utiliser une instruction préparée dans la procédure stockée pour y parvenir. Vous pouvez créer toute la requête select sous forme de chaîne dans une variable, puis la concaténer dans la chaîne délimitée par des virgules dans sa clause IN. Ensuite, vous pouvez créer une instruction préparée à partir de la variable de chaîne de requête et l'exécuter.

DELIMITER ;; 
create procedure testProc(in listString varchar(255)) 

BEGIN 

set @query = concat('select * from testTable where id in (',listString,');'); 
prepare sql_query from @query; 
execute sql_query; 

END 
;; 

DELIMITER ; 

call testProc("1,2,3"); 
0

J'ai analysé des données avec des traits d'union. L'exemple ci-dessous utilise une chaîne de texte fixe à démontrer, il suffit de modifier les références aux noms de colonnes pertinents dans la table. J'ai joué pendant des lustres avec un moyen de m'assurer qu'il fonctionnait sur des codes avec un nombre variable de composants et à la fin j'ai décidé d'ajouter la clause where. La plupart des données que vous essayez d'analyser comporteraient un nombre fixe de colonnes.

select 
SUBSTRING_INDEX(TS,"-",1) as "1", 
reverse(left(reverse(SUBSTRING_INDEX(TS,"-",2)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",2)))-1)) as "2", 
reverse(left(reverse(SUBSTRING_INDEX(TS,"-",3)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",3)))-1)) as "3", 
reverse(left(reverse(SUBSTRING_INDEX(TS,"-",4)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",4)))-1)) as "4", 
reverse(left(reverse(SUBSTRING_INDEX(TS,"-",5)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",5)))-1)) as "5", 
reverse(left(reverse(SUBSTRING_INDEX(TS,"-",6)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",6)))-1)) as "6",reverse(left(reverse(SUBSTRING_INDEX(TS,"-",7)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",7)))-1)) as "7", 
reverse(left(reverse(SUBSTRING_INDEX(TS,"-",8)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",8)))-1)) as "8", 
reverse(left(reverse(SUBSTRING_INDEX(TS,"-",9)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",9)))-1)) as "9", 
reverse(left(reverse(SUBSTRING_INDEX(TS,"-",10)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",10)))-1)) as "10" 
from (select "aaa-bbb-ccc-ddd-eee-fff-ggg-hhh-iii-jjj" as TS) as S 
where (LENGTH(TS)-LENGTH(REPLACE(TS,'-',''))) =9 
1

Je suis surpris ce n'est pas correctement mentionné en une ligne ici:

SELECT * FROM table 
WHERE id in (SELECT convert(int,Value) FROM dbo.Split(@list_string,',') 

Tout ce que vous avez besoin est un Split SQL function comme celui ci-dessous qui sera utile dans d'autres façons aussi:

CREATE FUNCTION dbo.Split 
(
    @List nvarchar(2000), 
    @SplitOn nvarchar(5) 
) 
RETURNS @RtnValue table 
(

    Id int identity(1,1), 
    Value nvarchar(100) 
) 
AS 
BEGIN 
While (Charindex(@SplitOn,@List)>0) 
Begin 
    Insert Into @RtnValue (value) 
    Select 
     Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1))) 
     Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List)) 
End 

Insert Into @RtnValue (Value) 
Select Value = ltrim(rtrim(@List)) 

Return 
END 
+1

Ceci est MSSQL T-SQL, pas MySQL – joezen777

33

est simple comme l'enfer pour MySQL:

SELECT * FROM table WHERE FIND_IN_SET(table.id, commaSeparatedData); 

Référence: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set

+3

Wow. C'était exactement ce que je cherchais! Merci. Cela devrait être la bonne réponse, je pense. –

+0

@JimmyKane ouais je pense aussi comme ça, mais malheureusement il y a déjà une bonne réponse :) – DarkSide

+1

@Peter Stegnar Vous devriez envisager de changer la meilleure réponse. –

Questions connexes