Передать массив в хранимую подпрограмму MySQL

Мне нужно передать массив строк в качестве параметра хранимой подпрограмме MySQL. Массив может быть длинным, и количество его элементов не фиксировано. Затем я хочу поместить строковые значения в таблицу в памяти с одним столбцом, чтобы я мог работать с данными. Я не знаю, можно ли это сделать в MySQL. Возможно, нужны грязные обходные пути.

Например, у меня есть строковые значения:

Banana, Apple, Orange

Теперь я хочу получить данные об этих фруктах из моей таблицы MySQL Fruits . Псевдокод:

create function GetFruits(Array fruitArray) 
   declare @temp table as
      fruitName varchar(100)
   end

   @temp = convert fruitArray to table
   select * from Fruits where Name in (select fruitName from @temp)
end

Microsoft SQL Server позволяет использовать тип данных TEXT и отправлять массив в виде строки XML, быстро создавая таблицу в памяти. Однако я не думаю, что такая техника возможна в MySQL.

Мы будем благодарны за любую помощь в том, как это сделать!

53
задан JakeGould 31 May 2018 в 08:54
поделиться

1 ответ

Я не уверен, отвечает ли это полностью на вопрос (это не), но это - решение, которое я предложил для своей подобной проблемы. Здесь я пытаюсь просто использовать, РАСПОЛАГАЮТСЯ () только однажды на разделитель.

-- *****************************************************************************
-- test_PVreplace

DROP FUNCTION IF EXISTS test_PVreplace;

delimiter //
CREATE FUNCTION test_PVreplace (
   str TEXT,   -- String to do search'n'replace on
   pv TEXT     -- Parameter/value pairs 'p1=v1|p2=v2|p3=v3'
   )
   RETURNS TEXT

-- Replace specific tags with specific values.

sproc:BEGIN
   DECLARE idx INT;
   DECLARE idx0 INT DEFAULT 1;   -- 1-origined, not 0-origined
   DECLARE len INT;
   DECLARE sPV TEXT;
   DECLARE iPV INT;
   DECLARE sP TEXT;
   DECLARE sV TEXT;

   -- P/V string *must* end with a delimiter.

   IF (RIGHT (pv, 1) <> '|') THEN
      SET pv = CONCAT (pv, '|');
      END IF;

   -- Find all the P/V pairs.

   SELECT LOCATE ('|', pv, idx0) INTO idx;
   WHILE (idx > 0) DO
      SET len = idx - idx0;
      SELECT SUBSTRING(pv, idx0, len) INTO sPV;

      -- Found a P/V pair.  Break it up.

      SELECT LOCATE ('=', sPV) INTO iPV;
      IF (iPV = 0) THEN
         SET sP = sPV;
         SET sV = '';
      ELSE
         SELECT SUBSTRING(sPV, 1, iPV-1) INTO sP;
         SELECT SUBSTRING(sPV, iPV+1) INTO sV;
         END IF;

      -- Do the substitution(s).

      SELECT REPLACE (str, sP, sV) INTO str;

      -- Do next P/V pair.

      SET idx0 = idx + 1;
      SELECT LOCATE ('|', pv, idx0) INTO idx;
      END WHILE;
   RETURN (str);
END//
delimiter ;

SELECT test_PVreplace ('%one% %two% %three%', '%one%=1|%two%=2|%three%=3');
SELECT test_PVreplace ('%one% %two% %three%', '%one%=I|%two%=II|%three%=III');
SELECT test_PVreplace ('%one% %two% %three% - %one% %two% %three%', '%one%=I|%two%=II|%three%=III');
SELECT test_PVreplace ('%one% %two% %three% - %one% %two% %three%', '');
SELECT test_PVreplace ('%one% %two% %three% - %one% %two% %three%', NULL);
SELECT test_PVreplace ('%one% %two% %three%', '%one%=%two%|%two%=%three%|%three%=III');
1
ответ дан 7 November 2019 в 08:27
поделиться
Другие вопросы по тегам:

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