2012-09-17 7 views
5

Im sperando che qualcuno possa essere d'aiuto. Ho creato il mio primo procdure memorizzato (niente di speciale), tuttavia ho incontrato un problema.MYSQL - Stored procedure che utilizza stringa separata da virgola come input variabile

voglio dargli una stringa di input come ad esempio 1,2,3,4,5 allora fa un semplice SELECT * FROM [TABLE] WHERE EAN IN (VAR);

Così il proc memorizzato assomiglia a questo:

-- -------------------------------------------------------------------------------- 
-- Routine DDL 
-- Note: comments before and after the routine body will not be stored by the server 
-- -------------------------------------------------------------------------------- 
DELIMITER $$ 

CREATE PROCEDURE `moments`.`new_procedure`(IN var1 VARCHAR(255)) 
BEGIN 

SELECT * FROM moments.PRODUCT WHERE EAN IN (var1); 

END 

Im am cercando di eseguirlo come tale:

Opere

call moments.new_procedure('5045318357397') 

non funziona

call moments.new_procedure('5045318357397,5045318357427'); 

Esegue ma non doesnt riportare alcun risultato. E 'classificare la seconda istruzione come una stringa per cui il suo fare questo:

select * from moments.PRODUCT WHERE EAN IN ('5045318357397,5045318357427') 

e non questo:

select * from moments.PRODUCT WHERE EAN IN ('5045318357397','5045318357427') 

Come devo formattare l'ingresso nella query eseguire per farlo prendere un stringa separata da virgola come input?

risposta

12

Si potrebbe utilizzare:

SELECT * FROM moments.PRODUCT 
WHERE FIND_IN_SET(EAN, var1) 

Questo dovrebbe funzionare ammesso che sia effettivamente virgola delimitata. Qualsiasi altra delimitazione non funzionerà in questo caso.

+0

Questo funziona perfettamente all'interno del processo memorizzato, grazie. Questo è anche il modo in cui lo chiamerò dall'applicazione Cast Iron, che è un ulteriore vantaggio. – MMKD

+2

funziona, ma non è molto efficiente in quanto ha bisogno di recuperare tutte le righe dalla tabella quindi confrontare ogni riga con il set, che a sua volta deve anche scorrere l'elenco separato da virgole per verificare se corrisponde ... Se il tuo # di colonne è basso, quindi va bene altrimenti dovresti trovare un modo di battitura – Populus

+0

Il commento di @Populus deve essere sradicato di più - FIND_IN_SET non usa indici di tabelle, quindi è potenzialmente un grosso problema di prestazioni se usato in questo modo –

1

Supponendo che la stringa che avete passato è convalidato in qualche modo e non contiene SQL dannoso, è possibile utilizzare le istruzioni preparate:

PREPARE stmt1 FROM CONCAT('select * from moments.PRODUCT WHERE EAN IN (',var1,')'); 
EXECUTE stmt1; 
Problemi correlati