Как я могу использовать переменную postgres в моем операторе SELECT?

Я сохраняю значение в переменной featureId а затем пытаюсь использовать это значение в своем операторе SELECT, но, похоже, postgres берет имя буквально и ищет столбец с именем "featureid". Я получаю сообщение об ошибке "ОШИБКА: столбец" featureid "не существует LINE 4: featureId"

Мой код ниже. Как я могу использовать значение переменной в моем операторе SELECT?

SELECT id INTO featureId FROM tableA WHERE NAME = 'some value'

INSERT INTO tableB (client_id, feature_id, does_have)
  SELECT
  id,
  featureId,
  TRUE
FROM tableA

Всего 2 ответа


Без объявленной переменной ваш SELECT INTO является версией SELECT INTO которая создает таблицу . Чтобы увидеть это сами, попробуйте:

SELECT id
       INTO featureid
       FROM tablea
       WHERE name = 'some value'

SELECT *
       FROM featureid;

Для присвоения значения переменной переменная должна быть объявлена. Вы можете использовать анонимный блок DO .

DO
$$
DECLARE
  featureid tablea.id%TYPE;
BEGIN
  SELECT id
         INTO featureid
         FROM tablea
         WHERE name = 'some value'

  INSERT INTO tableb
              (client_id,
               feature_id,
               does_have)
              SELECT id,
                     featureid,
                     true
                     FROM tablea;
END;
$$
LANGUAGE plpgsql;

Есть несколько ошибок в том, что вы пытаетесь сделать:

  • sql является декларативным языком, поэтому вы спрашиваете, что делать, а не как делать, и по этой причине вы не можете хранить переменные, и некоторые операторы, такие как объявлять и начинать-конец, должны использоваться в триггере, а не в простом запросе.
  • Вы выполняете два оператора: выберите и вставьте в, и они выполняются один за другим, так что еще раз вы не можете сохранить переменную.
  • вставить в, вставить одну запись, но, возможно, вы пытаетесь получить больше данных с помощью оператора select (если NAME не уникален)

если 'some-value' является известной константой, а NAME уникально, просто вставьте это значение в предложение where вставки в. Если вы пытаетесь вставить больше данных, взгляните на синтаксис массовой вставки postgres: массовая вставка


Есть идеи?

10000