Как обновить столбец на основе имени столбца в postgres? - PullRequest
0 голосов
/ 29 апреля 2018

Я сузил его до двух возможностей - DynamicSQL и использования оператора case.

Однако я не справился с обоими из них.

Я просто не понимаю dynamicSQL, и как бы я использовал его в моем случае.

Это моя попытка использовать операторы case; один из многих неудачных вариантов.

SELECT column_name,
CASE WHEN column_name = 'address' THEN (**update statement gives syntax error within here**)
END
FROM information_schema.columns
WHERE table_name = 'employees';

В качестве обзора я использую Axios для связи с моим Node-сервером, который выполняет вызовы в мою базу данных Heroku с помощью Massivejs.

Может быть, это не тот путь - вот моя главная проблема:

У меня возникли проблемы, потому что значения, которые я планирую использовать в качестве имен столбцов, отправляются на мой сервер в виде строк. Точный вызов, который я пытался использовать, это

update employees
set $1 = $2
where employee_id = $3;

Еще раз, я перехожу к тем, кто использует массивные.

Я получаю ошибку обратно { error: syntax error at or near "'address'"}, потому что мои входящие значения являются строками. Мой мыслительный процесс состоял в том, что приведенное выше утверждение позволит мне использовать переменные, потому что 'address' заключен в кавычки.

Но, увы, мой мыслительный процесс подвел меня.

Кажется, это близко к ответу на мой вопрос, но я не могу понять, что делать в моем случае, если использовать динамический SQL.

Как использовать динамические имена столбцов в операторе UPDATE или SELECT в функции?

Заранее спасибо.

1 Ответ

0 голосов
/ 29 апреля 2018

Я покажу вам способ сделать это с помощью функции. Сначала мы создаем таблицу сотрудников:

CREATE TABLE employees(
id BIGSERIAL PRIMARY KEY,
column1 TEXT,
column2 TEXT
);

Далее мы создаем функцию, которая требует три параметра:

columnName - имя столбца, который необходимо обновить

columnValue - новое значение, до которого необходимо обновить столбец

employeeId - идентификатор сотрудника, который будет обновлен

Используя функцию форматирования, мы генерируем запрос на обновление в виде строки и используем команду EXECUTE для выполнения запроса.

Вот код функции.

CREATE OR REPLACE FUNCTION update_columns_on_employee(columnName TEXT, columnValue TEXT, employeeId BIGINT)
  RETURNS VOID AS
  $$
  DECLARE update_statement TEXT := format('UPDATE EMPLOYEES SET %s = ''%s'' WHERE id = %L',columnName, columnValue, employeeId);
  BEGIN
    EXECUTE update_statement;
end;
$$ LANGUAGE plpgsql;

Теперь давайте вставим некоторые данные в таблицу сотрудников

  INSERT INTO employees(column1, column2) VALUES ('column1_start_value','column2_start_value');

Так что теперь у нас есть сотрудник со значением id, равным 1, который имеет значение column__start_value для column1 и значение column2_start_value для column2.

Если мы хотим обновить значение column2 с 'column2_start_value' до 'column2_new_value', все, что нам нужно сделать, это выполнить следующий вызов

SELECT * FROM update_columns_on_employee('column2','column2_new_value',1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...