@uuuu

Как передать значения?

Есть процедура которая принимает 2 аргумента: string ARG1 и string ARG2
Во второй аргумент требуется передать 'var1','var2','var3,'var4'

Как передать эти значения?
SQL думает что это еще 4 аргумента. Однако если взять их в "", то получится строка, что не подходит, поскольку этот аргумент требуется вставить в IN (ARG2)
  • Вопрос задан
  • 89 просмотров
Пригласить эксперта
Ответы на вопрос 2
pvsaintpe
@pvsaintpe
Senior PHP Developer
В mysql в отличие от Postgres нет массивов и прочих плюшек, вам надо создать процедуру которая по разделителю разделит строку на части и вставит во временную таблицу и вернет результат в виде набора (выборки) тогда этот результат вы можете использовать в where другого запроса

DELIMITER |

CREATE PROCEDURE explode( pDelim VARCHAR(32), pStr TEXT)                                
BEGIN                                
  DROP TABLE IF EXISTS temp_explode;                                
  CREATE TEMPORARY TABLE temp_explode (id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, word VARCHAR(40));                                
  SET @sql := CONCAT('INSERT INTO temp_explode (word) VALUES (', REPLACE(QUOTE(pStr), pDelim, '\'), (\''), ')');                                
  PREPARE myStmt FROM @sql;                                
  EXECUTE myStmt;                                
END |   

DELIMITER ;


Ну и в каком то запросе делайте так
SET @str  = "The quick brown fox jumped over the lazy dog"; 
 SET @delim = " "; 

CALL explode(@delim,@str);

Select * from some_table where field in (
  SELECT word FROM temp_explode
)


Пример грубый но идею вы должны понять.
Можно доработать чтобы процедура возвращала выборку, поэкспериментировать с переменными в общем если ваш путь через mysql.

А так смотрите в сторону postgres
Ответ написан
Комментировать
@Vitsliputsli
Как вариант, передавать в переменную значения разделенные запятыми, в процедуре IN заменить на FIND_IN_SET, что-то вроде:
select * from test where find_in_set(field, 'var1,var2,var3')>0;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы