Я хотел бы обновить строки со значениями, выбранными случайным образом из набора возможных значений.
В идеале я мог бы предоставить эти значения во время выполнения, используя JdbcTemplate
из приложения Java.
Пример:
В таблице столбец «имя» может содержать любое имя. Цель состоит в том, чтобы пробежаться по таблице и изменить все имена на «Боб» или «Алиса».
Я знаю, что это можно сделать, создав функцию sql. Я проверил это, и это было нормально, но мне интересно, можно ли просто использовать простой запрос?
Это не будет работать, кажется, что значение вычисляется один раз и применяется ко всем строкам:
UPDATE test.table
SET first_name =
(SELECT a.name
FROM
(SELECT a.name, RAND() idx
FROM (VALUES('Alice'), ('Bob')) AS a(name) ORDER BY idx FETCH FIRST 1 ROW ONLY) as a)
;
Я пытался использовать MERGE INTO
, но он даже не запустился (возможные имена не найдены в запросе SET
). Мне еще предстоит выяснить, почему:
MERGE INTO test.table
USING
(SELECT
names.fname
FROM
(VALUES('Alice'), ('Bob'), ('Rob')) AS names(fname)) AS possible_names
ON ( test.table.first_name IS NOT NULL )
WHEN MATCHED THEN
UPDATE SET
-- select random name
first_name = (SELECT fname FROM possible_names ORDER BY idx FETCH FIRST 1 ROW ONLY)
;
РЕДАКТИРОВАТЬ: Если возможно, я бы хотел сосредоточиться только на обновлении полей и не зависеть от знания первичных ключей и тому подобное.