Как обновить все строки в столбце со случайными значениями? - PullRequest
0 голосов
/ 21 сентября 2018

Рассмотрим таблицу с именем data_records , имеющую 5 записей и 2 столбца (C1 и C2).

Цель состоит в том, чтобы обновить всестроки столбца C2 с разными случайными значениями для каждого.

Следующее не работает:

UPDATE data_records SET
  C2 = d.r
FROM
  (SELECT random() as r, generate_series(1, 5) as g) as d

, так как оно обновляет все строки C2 с одинаковымичисло.

Однако подзапрос

SELECT random() as r, generate_series(1, 5) as g

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

Как получить поведениеЯ описываю?

ОБНОВЛЕНИЕ

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

SET C2 = jsonb_set(C2, '{variation}', to_jsonb(d.r))

Благодаря комментариям я поняла, что в моем первоначальном вопросе не хватает объяснения.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

использовать только функцию random без подзапроса

update t
   set C2 = random() 
0 голосов
/ 21 сентября 2018

demo: db <> fiddle

Самый простой для вашего JSON:

UPDATE 
    data_records dr
SET 
    c2 = jsonb_set(dr.c2, '{variation}', to_jsonb(random()));

Если вам нужен второй столбец с generate_series (для чего угодно) вам понадобится что-то, чтобы присоединиться к исходному столу.generate_series может дать вам строки от 1 до 5.Таким образом, чтобы присоединиться к data_records, вам также понадобится столбец от 1 до 5.Если это то, что сохранено в c1, то нет проблем.Просто присоединитесь против c 1.

Но если нет, то вам нужно сгенерировать его, возможно, с помощью оконной функции row_number, которая добавляет количество строк в виде столбца.Затем вы можете присоединиться к числу строк в столбце generated_series, и у вас есть строка со значением random для каждого c1 и c2.Один из них должен быть уникальным.Этот уникальный столбец (в моем случае c1) работает как фильтр WHERE предложения UPDATE.Конечно, это может быть c2.Но если они не уникальны, вы получите одинаковые random значения для тех же c1/c2 значений:

UPDATE 
    data_records dr
SET 
    c2 = jsonb_set(dr.c2, '{variation}', to_jsonb(rand.r))
FROM 
    (SELECT *, row_number() OVER () rn FROM data_records) dr_rn
LEFT JOIN
    (SELECT generate_series(1, 5) gs , random() r) rand 
ON dr_rn.rn = rand.gs

WHERE dr.c1 = dr_rn.c1;

Было бы действительно проще, если бы у вас был уникальный столбец идентификатора.Но, тем не менее, я не вижу причин, чтобы сделать это настолько сложным.

0 голосов
/ 21 сентября 2018

Я думаю, что это будет делать то, что вы хотите:

UPDATE data_records
    SET C2 = random();

Я не уверен, почему вы хотите использовать подзапрос или generate_series().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...