Я хочу создать функцию, которая будет обновлять столбец типа varchar
до предпочтительной строки, на которую есть ссылка в столбце другой таблицы, чтобы помочь мне очистить этот столбец более итеративно.
CREATE TABLE big_table (
mn_uid NUMERIC PRIMARY KEY,
user_name VARCHAR
);
INSERT INTO big_table VALUES
(1, 'DAVE'),
(2, 'Dave'),
(3, 'david'),
(4, 'Jak'),
(5, 'jack'),
(6, 'Jack'),
(7, 'Grant');
CREATE TABLE nameKey_table (
nk_uid NUMERIC PRIMARY KEY,
correct VARCHAR,
wrong VARCHAR
);
INSERT INTO nameKey_table VALUES
(1, 'David', 'Dave_DAVE_dave_DAVID_david'),
(2, 'Jack', 'JACK_jack_Jak_jak');
Я хочу выполнить следующую процедуру:
UPDATE big_table
SET user_name = (SELECT correct
FROM nameKey_table
WHERE wrong
LIKE '%DAVE%')
WHERE user_name = 'DAVE';
, но зациклить на каждом user_name
в big_table
, чтобы у меня была функция, которая может делать что-то вроде этого:
UPDATE big_table SET user_name = corrected_name_fn();
Вот моя попытка сделать что-то подобное, но я не могу заставить его работать:
CREATE FUNCTION corrected_name_fn() RETURNS VARCHAR AS $$
DECLARE entry RECORD;
DECLARE correct_name VARCHAR;
BEGIN
FOR entry IN SELECT DISTINCT user_name FROM big_table LOOP
EXECUTE 'SELECT correct
FROM nameKey_table
WHERE wrong
LIKE ''%$1%'''
INTO correct_name
USING entry;
RETURN correct_name;
END LOOP;
END;
$$ LANGUAGE plpgsql;
Я хочу, чтобы конечный результат в big_table
был:
| mn_uid | user_name |
| 1 | 'David' |
| 2 | 'David' |
| 3 | 'David' |
| 4 | 'Jack' |
| 5 | 'Jack' |
| 6 | 'Jack' |
| 7 | 'Grant' |
Я понимаю, что строки 6 и 7 предоставляют два уникальных случая, которые я хочу встроить в функцию с помощью операторов IF ELSE
.
- Если
user_name
находится в nameKey_table.correct
, перейдите к следующему - Если
user_name
не в nameKey_table.correct
или не соответствует строке в nameKey_table.wrong
, оставьтекак есть.
Спасибо за любую помощь в этом !!