Используйте конструктор ARRAY вместо (недопустимого) литерала массива.
(ARRAY[site_GRO, site_WHS, site_SHR])[ceil(random()*3)]
Однако решение на основе набора обычно более эффективно, чем зацикливание:
UPDATE customer."user" u
SET primary_site_id = CASE trunc(random()*3)::int
WHEN 0 THEN site_gro -- your variables here
WHEN 1 THEN site_whs
WHEN 2 THEN site_shr
END
FROM users_to_add ua
WHERE u.userid = ua.email_address;
Должен добиться того же.Работает внутри блока PL / pgSQL или как отдельная команда SQL DML (тогда вам нужно самостоятельно интерполировать значения переменных).
Одна многорядная строка UPDATE
равна много дешевле, чем многие обновления в цикле.
trunc()
немного более правильно, чем ceil()
, так как random () возвращает значение в домене[0,1)
(1
исключено).Это также быстрее.
И конструкция CASE
значительно быстрее, чем создание массива только для извлечения из него одного элемента.
В сторону:
Избегайте использования зарезервированных слов, таких как user
, в качестве идентификаторов.Всегда требует двойных кавычек и может привести к ошибочным ошибкам, если их забыть.Также избегайте случайной прописной буквы в идентификаторах.Это касается как SQL, так и PL / pgSQL.См .: