#sql #oracle #plsql
#sql #Oracle #plsql
Вопрос:
Итак, это то, что у меня есть. Например, поле содержит шесть букв:
A, B, C, D, E, F
ОК. Теперь я хочу обновить это поле и добавить букву G
. Я могу использовать этот скрипт:
declare
v_c pls_integer;
v_s varchar(7) := 'LETTERS';
begin
select 1 into v_c from some_table where lower(some_column_name) = lower(v_s);
if (v_c = 1) then
execute immediate 'update some_table set values = ''A,B,C,D,E,F,G''
where lower(some_column_name) = lower('''||v_s||''')';
commit;
end if;
end;
/
Но мне нужно проверить. Это поле может уже содержать некоторые буквы. Возможно, эта буква уже есть в этом списке. Например, буква C
. Если буква уже существует, не добавляйте ее. Если такой буквы нет, просто добавьте ее в конец (через запятую). Как я могу это сделать?
Комментарии:
1. Что делать, если у вас есть
A,B,C,F
, и вам нужно добавитьE
?2. Просто добавьте в конец..
3. ну .. нужно сказать — это плохая нормализация. вы могли бы легко сделать это с помощью уникального ограничения и простых вставок, если они будут правильно нормализованы.
4. Да, я согласен) Но это то, что существует сейчас.
Ответ №1:
Я думаю, что вам просто нужно другое условие в предложении where:
where ',' || values || ',' not like '%,' || v_s || ',%'
Ответ №2:
Самый простой способ — просто добавить его в список существующих букв.
Настройка
CREATE TABLE test_letters
(
letters VARCHAR2 (50)
);
insert into test_letters
SELECT 'A, B, C, D' AS letters FROM DUAL
UNION ALL
SELECT 'A, B, C, D, E, F' AS letters FROM DUAL;
Обновить
UPDATE test_letters
SET letters = letters || ', G'
WHERE letters not like '%G%';
Ответ №3:
Другим вариантом является функция INSTR, которая может работать лучше, чем LIKE или Reg exp .
update test_letters
set letters = letters || ', G'
where instr(letters,'G') = 0;