2010-11-24 3 views
0

Я хочу выбрать из таблицы, где поле находится в заданной строке csv, переданной в сохраненный proc.Mysql select where field in csv string

Каков самый быстрый способ сделать это? Должен ли я вставлять значения во временную таблицу и присоединяться к этому? Или есть способ сделать это с одним утверждением?

Благодаря

ответ

1

НОВЫЙ ОТВЕТ -

Ну вы должны сделать что-то вроде этого, как указано ниже. Я предполагаю, что ваша строка csv будет указана в переменной @str ниже. Иначе вы должны убедиться, что ваша строка (или arraystring) должна иметь этот формат с одинарными кавычками для каждого элемента -

set @str = "'some1','some2','some3'"; 
set @qry1 = CONCAT('select * from testing where col1 in (',@str,')'); 

prepare stmt1 from @qry1; 
execute stmt1; 
deallocate prepare stmt1; 

OLD ОТВЕТ -

Я предполагаю, что вы пройдете путь CSV-файл с хранимыми proc и читать строки в csv в том, что хранится proc. Так что в принципе вы можете хранить все эти CSV значения полей в временную таблицу и написать запрос с использованием IN -

select * from sourceTable 
where fieldValue in (select csvFieldValue from #temptable) 
+0

Нет, это не файл, а текстовое поле типа «token1, token2, token3» и т. Д., Которое передается в качестве параметра. – Chris

+0

@ Chris - Отредактировал мой ответ. Протестировано с заданной строкой, и она отлично работает. Возможно, вам придется немного манипулировать строковым массивом, который у вас есть. –

+0

Необходимо сделать некоторые манипуляции с строкой в ​​агенте, чтобы получить правильные цитаты, но хорошо работает, спасибо! – Chris

0

ли некоторые искал вокруг и нашел отличный ответ :) строковую функцию

Используйте MySql в FIND_IN_SET..

Пример использование:

SET @csvStr = "val1,val2,val3"; 

SELECT Col1 
    FROM Table1 
WHERE FIND_IN_SET(Col2, @csvStr) > 0; 

Я редактировал текущий ответ с «Новым Ответом» и «Старым Ответом», указывая на то, что новый ответ открывает вашу систему к уязвимости SQL Injection.