Обновление одного столбца для нескольких строк в oracle10g - PullRequest
0 голосов
/ 21 сентября 2011
Update table_1 set col1= 1 where col2 = 'ONE';  
update table_1 set col1= 2 where col2 = 'TWO';  
Update table_1 set col1= 3 where col2 = 'THREE';
...
update table_1 set col1= 100 where col2 = 'HUNDRED';

Есть ли какой-нибудь упрощенный способ добиться этого в одном запросе вместо записи 100 обновлений состояний сетей в oracle10g ??

Ответы [ 2 ]

2 голосов
/ 23 сентября 2011

Я думаю, что могло бы быть решение с Oracle Case-Statement или функцией декодирования, хотя это будет довольно длинное утверждение, и я не совсем уверен, в чем может быть преимущество перед 100 операторами обновления. Также я не знаю каких-либо ограничений относительно длины списков параметров и т. Д.

Пример для дела:

update table_1
set col1 = CASE col2
  WHEN 'ONE' THEN 1
  WHEN 'TWO' THEN 2
  WHEN 'THREE' THEN 3
  WHEN 'FOUR' THEN 4
  WHEN 'FIVE' THEN 5
  WHEN 'SIX' THEN 6
  WHEN 'SEVEN' THEN 7
  WHEN 'EIGHT' THEN 8
  ...
  WHEN 'HUNDRED' THEN 100
  ELSE col2
END;

Пример для декодирования:

update table_1
set col1 = decode(col2,
              'ONE', 1,
              'TWO', 2,
              'THREE', 3,
              'FOUR', 4,
              'FIVE', 5,
              'SIX', 6,
              'SEVEN', 7,
              'EIGHT', 8,
              ...
              'HUNDRED', 100,
              col2);
0 голосов
/ 24 сентября 2011

Вы можете использовать форматы правописания в юлианском стиле (для получения более подробной информации найдите asktom.oracle.com)

Вот вывод из моего сеанса: -

create table table_1 (col_1 number, col_2 varchar(20))

insert into table_1 (col_1, col_2) values (null, 'THIRTY-THREE')
insert into table_1 (col_1, col_2) values (null, 'SEVEN')
insert into table_1 (col_1, col_2) values (null, 'EIGHTY-FOUR')

select * from table_1 
COL_1     COL_2     
       THIRTY-THREE     
       SEVEN    
       EIGHTY-FOUR

update /*+bypass_ujvc*/
(select t1.col_1, spelled.n
from
table_1 t1
inner join
(select n, to_char(to_date (n, 'J'),'JSP') spelled_n from
(select level n from dual connect by level <= 100)) spelled
on t1.col_2 = spelled.spelled_n
)
set col_1 = n

select * from table_1

COL_1 COL_2
33     THIRTY-THREE
7      SEVEN
84     EIGHTY-FOUR

Подсказка (bypass_ujvc) игнорирует тот факт, что встроенное представление не сохраняется ключом - на практике вы должны использовать вместо этого оператор слияния. Но это не реальный сценарий, верно! (И вам придется рассматривать ваш «СТО» как особый случай = «ОДИН СТО».)

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