Заменить значение столбца таблицы, используя часть того же столбца - PullRequest
0 голосов
/ 31 мая 2019

Я обновляю столбец в моей таблице, заменяя столбец частью его существующего значения:

Update Table_Name Set VarName '12345' where VarName = 'AA-BB-12345';
Update Table_Name Set VarName '99999' where VarName = 'XX-AR-99999';
...

Как сделать это в цикле, чтобы он вносил изменения во всю извлеченную таблицу Table_Nameпоследний элемент VarName и использовать это для обновления?В таблице нужно обновить 500 строк, слишком много, чтобы выполнить отдельные строки обновления, поэтому мне нужен цикл для этого.

Я думаю, что это близко:

Update Table_Name
set VarName = ( select regexp_substr(VarName, '[^-]+,1,3 ) from Table_Name );

1 Ответ

2 голосов
/ 31 мая 2019

Вы не так уж далеки, но ваш подзапрос не коррелирован - нет никакой связи между значениями, которые находит подзапрос, и строкой, которая обновляется, поэтому вы, вероятно, получаете ошибку ORA-01427. Но вам не нужен подзапрос, так как вы обновляете ту же строку:

update table_name set varname = regexp_substr(varname, '[^-]+', 1, 3);

Вы можете сделать это и без регулярного выражения:

update table_name set varname = substr(varname, instr(varname, '-', -1) + 1);

, что также имеет то преимущество, что не обнуляет строки, которые не являются ожидаемым шаблоном. Тем не менее, вы можете уменьшить ненужную работу, обновляя значения только тире:

update table_name set varname = substr(varname, instr(varname, '-', -1) + 1)
where instr(varname, '-', -1) > 0;

или

update table_name set varname = regexp_substr(varname, '[^-]+', 1, 3)
where regexp_substr(varname, '[^-]+', 1, 3) is not null;

, который будет обновлять только те строки, в которых старое значение имеет (как минимум) три элемента.

Два обновления будут вести себя по-разному, если есть два элемента - первый с substr/instr всегда будет занимать последнюю часть после тире, если они есть; Второй с rexexp_substr не будет обновлять один с тире. Вы показали только один фиксированный шаблон, поэтому ни один из них не может иметь отношение к вам. По крайней мере, пока вы снова не запустите то же самое обновление для этих данных ...

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