SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 06.05.2011 13:50:43

kharkov_max
Завсегдатай
Зарегистрирован: 12.09.2009
Сообщений: 62

where ... In (значение из переменной)

Добрый день.

Из таблицы необходимо выбрать данные по заранее известным значениям определенного столбца.
Если делать так:

Код:

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 массив.

Заранее спасибо за помощь.

Неактивен

 

#2 06.05.2011 14:26:01

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Re: where ... In (значение из переменной)

Mysql не поддерживает массивы, но можно наверное написать хитрую функцию которая оперируя строковыми функциями в цикле будет имитировать массив. Например функция:
ELT(N,str1,str2,str3,...)
Возвращает str1, если N = 1, str2, если N = 2, и так далее. Если N меньше, чем 1 или больше, чем число аргументов, возвращается NULL.

Неактивен

 

#3 06.05.2011 15:13:26

kharkov_max
Завсегдатай
Зарегистрирован: 12.09.2009
Сообщений: 62

Re: where ... In (значение из переменной)

Хорошо, а как значения переменных, к примеру, можно передать в функцию IN, в конструкции ... where ... in ('') ?

Неактивен

 

#4 06.05.2011 15:57:29

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Re: where ... In (значение из переменной)

А зачем Вам вообще передавать их как строку переменные эти? если все равно потом эту строку нужно разбивать на элементы, передавайте их как есть (Ваш 1 пример) и проблемы не будет smile

Отредактированно simple (06.05.2011 15:58:15)

Неактивен

 

#5 12.05.2011 11:15:15

kharkov_max
Завсегдатай
Зарегистрирован: 12.09.2009
Сообщений: 62

Re: where ... In (значение из переменной)

simple написал:

А зачем Вам вообще передавать их как строку переменные эти? если все равно потом эту строку нужно разбивать на элементы, передавайте их как есть (Ваш 1 пример) и проблемы не будет smile

Хочу передавать их в процедуру, т.к. эти значения могут быть разными ...

UP

Неактивен

 

#6 12.05.2011 11:39:45

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Re: where ... In (значение из переменной)

ну так и передавайте, в чем проблема то,
call proc_name(i,q,w,name1,name2,name3) так не работает что ли?

Отредактированно simple (12.05.2011 11:41:12)

Неактивен

 

#7 12.05.2011 11:49:38

kharkov_max
Завсегдатай
Зарегистрирован: 12.09.2009
Сообщений: 62

Re: where ... In (значение из переменной)

simple написал:

ну так и передавайте, в чем проблема то,
call proc_name(i,q,w,name1,name2,name3) так не работает что ли?

Как подставить эти переменные (значения) в конструкцию

where t.name in ('name1','name2','name3')

А конкретно, передать в функцию IN ...

Неактивен

 

#8 12.05.2011 12:41:06

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Re: where ... In (значение из переменной)

Издеваешься что ли smile
так и подставляй where t.name in (name1,name2,name3)

Неактивен

 

#9 12.05.2011 12:46:27

kharkov_max
Завсегдатай
Зарегистрирован: 12.09.2009
Сообщений: 62

Re: where ... In (значение из переменной)

simple написал:

Издеваешься что ли smile
так и подставляй where t.name in (name1,name2,name3)

Да не издеваюсь я ...

Когда делаю так:

Код:

set @name = "name1"
select * from table t
where t.name in (@name)

Т.е. в  In подставляю значение переменной, то запрос не работает ...
Точнее работает, но не выводит данные по значению @name.
Вот отсюда и спрашиваю как передать в IN параметром в процедуре.

Неактивен

 

#10 12.05.2011 12:52:46

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Re: where ... In (значение из переменной)

значит нет в столбце name значения name1

Отредактированно simple (12.05.2011 12:58:04)

Неактивен

 

#11 12.05.2011 13:05:13

kharkov_max
Завсегдатай
Зарегистрирован: 12.09.2009
Сообщений: 62

Re: where ... In (значение из переменной)

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 , только сегодня обновил.

Неактивен

 

#12 12.05.2011 13:10:45

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Re: where ... In (значение из переменной)

Вы этот запрос где пишете, в процедуре? У меня Ваш запрос работает прекрасно Mysql 5.1.35

Отредактированно simple (12.05.2011 13:15:12)

Неактивен

 

#13 12.05.2011 13:19:34

kharkov_max
Завсегдатай
Зарегистрирован: 12.09.2009
Сообщений: 62

Re: where ... In (значение из переменной)

simple написал:

Вы этот запрос где пишете, в процедуре? У меня Ваш запрос работает прекрасно

Так и хочется сказать "мля" ...

Перебил все заново руками - все прекрасно заработало.
Всем спасибо за помощь, вопрос снимается ...

Что было Х.З ...

Неактивен

 

#14 12.05.2011 13:38:15

kharkov_max
Завсегдатай
Зарегистрирован: 12.09.2009
Сообщений: 62

Re: where ... In (значение из переменной)

Хм..

Вот теперь новый вопрос выскочил, может что то подскажете.

А как в переменной можно указать несколько значений и подставить их в IN
Что то вроде такого:

Код:

set @name="name1,name2,name3"
select * from table t
where t.name in (@name)

Ну и запрос должен выбрать строки по значениям name1,name2 и name3

Неактивен

 

#15 12.05.2011 21:24:35

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: where ... In (значение из переменной)

По моему вы ищите это.

DELIMITER $$

CREATE DEFINER=`my_db`@`localhost` PROCEDURE `getNames`(name_list varchar(1000))
BEGIN
 
  SET @s = CONCAT('SELECT * FROM table WHERE name in(',name_list,')');
  PREPARE SMTP FROM @s;
  EXECUTE SMTP;  

END$$

DELIMITER ;


CALL getNames("'vasya','petya','sasha','dima'");

Отредактированно evgeny (12.05.2011 21:25:17)

Неактивен

 

#16 12.05.2011 21:27:45

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: where ... In (значение из переменной)

Ну таки передать массив никак нельзя, т.к. массивов нет. Можете
завести временную табличку с id, а потом объединиться с ней
внутри процедуры.

Альтернативный вариант — подготовить выражение (PREPARE)
из строки через запятые, а потом выполнить его.

Неактивен

 

#17 16.05.2011 10:34:45

kharkov_max
Завсегдатай
Зарегистрирован: 12.09.2009
Сообщений: 62

Re: where ... In (значение из переменной)

paulus написал:

Ну таки передать массив никак нельзя, т.к. массивов нет. Можете
завести временную табличку с id, а потом объединиться с ней
внутри процедуры.

Альтернативный вариант — подготовить выражение (PREPARE)
из строки через запятые, а потом выполнить его.

Сделал через временную табличку, все получилось.

Выражения не совсем подходили т.к. данные (передаваемые в процедуру) необходимо было еще определенным образом обрабатывать, в связи с этим написание выражений могло слишком усложниться.

Всем спасибо за помощь.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson