Невозможно выполнить инструкцию MySQL SELECT, когда внутри CONCAT

0

Я пытаюсь создать простой цикл операторов SELECT в MySQL для сокращения кода. Я начал это с помощью CONCAT() но это заставляет процедуру останавливаться/терпеть неудачу. Например (где k - счетчик циклов):

CONCAT('SELECT (Child_', k, ' INTO @Age_Child_', k, ' FROM lookup_childage WHERE ModYear = ModYear_var LIMIT 1)');

Чтобы диагностировать проблему, я просто попытался поместить инструкцию SELECT (без конкатенированных переменных цикла) внутри строки, чтобы выполнить ее. Хотя я мог бы заставить это работать для простых операторов, это не сработает для следующего:

SET @queryString = CONCAT('SELECT Child_1 INTO @Age_Child_1 FROM lookup_childage WHERE ModYear = ModYear_var LIMIT 1');    
PREPARE stmt FROM @queryString;
EXECUTE stmt;

Кто-нибудь знает, почему @queryString содержащий @queryString CONCAT(), не будет выполняться/вызывать сбой процедуры?

Теги:

1 ответ

0
Лучший ответ

tl; dr Оператор, который вы пытаетесь написать, имеет форму SELECT(rest of statement) LIMIT 1. Он должен иметь форму SELECT rest of statement LIMIT 1.

Похоже, вы хотите создать имена переменных столбцов, ummm, потому что ваша таблица lookup_childage денормализована. Я полагаю, что в таблице есть эти столбцы.

  Child_1   INT
  Child_2   INT
  Child_3   INT
  Child_4   INT

Похоже, вы надеетесь получить значение @queryString содержащее такие вещи:

SELECT Child_4 INTO @Age_Child_4 FROM lookup_childage WHERE ModYear = ModYear_var LIMIT 1

Только 4 являются переменными.

Итак, чтобы получить нужную строку

 SELECT CONCAT('SELECT Child_', k,
               ' INTO @Age_Child_', k,
               ' FROM lookup_childage WHERE ModYear = ModYear_var LIMIT 1'
              )
    INTO @queryString;
  • 0
    Спасибо, о, Джонс, созданная тобой строка - именно то, чего я пытаюсь достичь. Единственное, что я могу пояснить, это то, что по какой-то причине я не могу выполнить это в процедуре, используя 'PREPARE stmt FROM @queryString;' и «EXECUTE stmt;» Вы знаете, почему это может не выполняться?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню