Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день.
Из таблицы необходимо выбрать данные по заранее известным значениям определенного столбца.
Если делать так:
select * from table t where t.name in ('name1','name2','name3')
Все работает как нужно.
Вопрос:
1. Можно ли как то в конструкцию in подставить массив значений?
2. Можно ли сделать как то так?
set @name = "'name1','name2','name3'" select * from table t where t.name in (@name)
Но так не работает ...
Цель:
Код планируется как процедура, и значения in хотелось бы передавать как параметр списком.
К примеру как то так:
call proc_name(i,q,w,"name1,name2,name3")
Далее или как переменную передать в in или сделать массив и как то подставить в in массив.
Заранее спасибо за помощь.
Неактивен
Mysql не поддерживает массивы, но можно наверное написать хитрую функцию которая оперируя строковыми функциями в цикле будет имитировать массив. Например функция:
ELT(N,str1,str2,str3,...)
Возвращает str1, если N = 1, str2, если N = 2, и так далее. Если N меньше, чем 1 или больше, чем число аргументов, возвращается NULL.
Неактивен
Хорошо, а как значения переменных, к примеру, можно передать в функцию IN, в конструкции ... where ... in ('') ?
Неактивен
А зачем Вам вообще передавать их как строку переменные эти? если все равно потом эту строку нужно разбивать на элементы, передавайте их как есть (Ваш 1 пример) и проблемы не будет
Отредактированно simple (06.05.2011 15:58:15)
Неактивен
simple написал:
А зачем Вам вообще передавать их как строку переменные эти? если все равно потом эту строку нужно разбивать на элементы, передавайте их как есть (Ваш 1 пример) и проблемы не будет
Хочу передавать их в процедуру, т.к. эти значения могут быть разными ...
UP
Неактивен
ну так и передавайте, в чем проблема то,
call proc_name(i,q,w,name1,name2,name3) так не работает что ли?
Отредактированно simple (12.05.2011 11:41:12)
Неактивен
simple написал:
ну так и передавайте, в чем проблема то,
call proc_name(i,q,w,name1,name2,name3) так не работает что ли?
Как подставить эти переменные (значения) в конструкцию
where t.name in ('name1','name2','name3')
А конкретно, передать в функцию IN ...
Неактивен
Издеваешься что ли
так и подставляй where t.name in (name1,name2,name3)
Неактивен
simple написал:
Издеваешься что ли
так и подставляй where t.name in (name1,name2,name3)
Да не издеваюсь я ...
Когда делаю так:
set @name = "name1" select * from table t where t.name in (@name)
Т.е. в In подставляю значение переменной, то запрос не работает ...
Точнее работает, но не выводит данные по значению @name.
Вот отсюда и спрашиваю как передать в IN параметром в процедуре.
Неактивен
значит нет в столбце name значения name1
Отредактированно simple (12.05.2011 12:58:04)
Неактивен
simple написал:
значит нет в столбце name значения name1
Ошибиться не мог, т.к. это весь запрос ))) кусочком тестил
"name1" это одно из значений в таблице "t" столбца "name".
Если делаю так:
select * from table t where t.name in ('name1')
то работает, если так:
set @name="name1" select * from table t where t.name in (@name)
нет - запрос возвращает пустоту.
Уточню: Mysql 5.5.12 , только сегодня обновил.
Неактивен
Вы этот запрос где пишете, в процедуре? У меня Ваш запрос работает прекрасно Mysql 5.1.35
Отредактированно simple (12.05.2011 13:15:12)
Неактивен
simple написал:
Вы этот запрос где пишете, в процедуре? У меня Ваш запрос работает прекрасно
Так и хочется сказать "мля" ...
Перебил все заново руками - все прекрасно заработало.
Всем спасибо за помощь, вопрос снимается ...
Что было Х.З ...
Неактивен
Хм..
Вот теперь новый вопрос выскочил, может что то подскажете.
А как в переменной можно указать несколько значений и подставить их в IN
Что то вроде такого:
set @name="name1,name2,name3" select * from table t where t.name in (@name)
Ну и запрос должен выбрать строки по значениям name1,name2 и name3
Неактивен
По моему вы ищите это.
Отредактированно evgeny (12.05.2011 21:25:17)
Неактивен
Ну таки передать массив никак нельзя, т.к. массивов нет. Можете
завести временную табличку с id, а потом объединиться с ней
внутри процедуры.
Альтернативный вариант — подготовить выражение (PREPARE)
из строки через запятые, а потом выполнить его.
Неактивен
paulus написал:
Ну таки передать массив никак нельзя, т.к. массивов нет. Можете
завести временную табличку с id, а потом объединиться с ней
внутри процедуры.
Альтернативный вариант — подготовить выражение (PREPARE)
из строки через запятые, а потом выполнить его.
Сделал через временную табличку, все получилось.
Выражения не совсем подходили т.к. данные (передаваемые в процедуру) необходимо было еще определенным образом обрабатывать, в связи с этим написание выражений могло слишком усложниться.
Всем спасибо за помощь.
Неактивен