powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как в одном запросе обновить поле таблицы расчетным значением другого поля
12 сообщений из 12, страница 1 из 1
Как в одном запросе обновить поле таблицы расчетным значением другого поля
    #39235454
Bazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос такой, в update-запросе высчитываю и обновляю поле F1,
а поле F2 должно принять значение исходя из вновь расcчитанного значения поля F1.

Код: plsql
1.
2.
3.
4.
5.
update T 
set 
F1 = nullif(trim(coalesce(F1||' ', '') || case when СЛОЖНОЕ_УСЛОВИЕ_1 then ВЫЗОВ_СЛОЖНОЙ_ФУНКЦИИ_1 else '' end ) = ''),
F2 = case when СЛОЖНОЕ_УСЛОВИЕ_2 and F1 is not null then ВЫЗОВ_СЛОЖНОЙ_ФУНКЦИИ_2 else F2 end
where ...



Но новое значение поля F1 не видно внутри запроса до самого комита, а заново высчитывать СЛОЖНОЕ_УСЛОВИЕ_1 и делать ВЫЗОВ_СЛОЖНОЙ_ФУНКЦИИ_1 затратно.

Заранее благодарен за помощь!
...
Рейтинг: 0 / 0
Как в одном запросе обновить поле таблицы расчетным значением другого поля
    #39235492
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как в одном запросе обновить поле таблицы расчетным значением другого поля
    #39235694
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BazzzНо новое значение поля F1 не видно внутри запроса до самого комита, а заново высчитывать СЛОЖНОЕ_УСЛОВИЕ_1 и делать ВЫЗОВ_СЛОЖНОЙ_ФУНКЦИИ_1 затратн

Высчитывайте СЛОЖНОЕ_УСЛОВИЕ_1 с использование СТЕ (with)
...
Рейтинг: 0 / 0
Как в одном запросе обновить поле таблицы расчетным значением другого поля
    #39235791
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bazzz,
я бы для начала не впадал в истерику, а посмотрел, являются ли СЛОЖНОЕ_УСЛОВИЕ_1 и ВЫЗОВ_СЛОЖНОЙ_ФУНКЦИИ_1 имутабными, или хотя бы stable. и понадеялся на оптимизатор. всё же не инструкции пишем. (ну там нотификацию бы имутабную воткнул и проверил гипотезу "о черном ящике")

во вторых в пж можно сказать
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SET (F1,F2) =
  CASE
      WHEN ....
      THEN (A,B)
      WHEN ....
      THEN (A1,B1)
.....
  END


-- тоже вариант
ну и наконец подзапрос во from или CTE


но варианта ветвления вида SET #CASE WHEN ... #THEN {a=b ,c =d,e=f}
и в т.п. конструкциях SQL -- наверное немного не хватает. нужно какое слово -- ветвитель не значений, а вложенных саб--кляуз. как оно должно выглядеть -- не совсем понятно. но было бы неплохо.
...
Рейтинг: 0 / 0
Как в одном запросе обновить поле таблицы расчетным значением другого поля
    #39239051
Bazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, tip78!

Ознакомился, но по ссылке нет ничего по теме!?
...
Рейтинг: 0 / 0
Как в одном запросе обновить поле таблицы расчетным значением другого поля
    #39239065
Bazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
big-trot,
спасибо, но with не интересно, в каждой строке будет разное значение, получается использование темп-таблички ...., проще тогда условие повторить для каждого поля.
...
Рейтинг: 0 / 0
Как в одном запросе обновить поле таблицы расчетным значением другого поля
    #39239106
Bazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwqBazzz,
я бы для начала не впадал в истерику, а посмотрел, являются ли СЛОЖНОЕ_УСЛОВИЕ_1 и ВЫЗОВ_СЛОЖНОЙ_ФУНКЦИИ_1 имутабными, или хотя бы stable. и понадеялся на оптимизатор. всё же не инструкции пишем. (ну там нотификацию бы имутабную воткнул и проверил гипотезу "о черном ящике")

во вторых в пж можно сказать
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SET (F1,F2) =
  CASE
      WHEN ....
      THEN (A,B)
      WHEN ....
      THEN (A1,B1)
.....
  END


-- тоже вариант
ну и наконец подзапрос во from или CTE


но варианта ветвления вида SET #CASE WHEN ... #THEN {a=b ,c =d,e=f}
и в т.п. конструкциях SQL -- наверное немного не хватает. нужно какое слово -- ветвитель не значений, а вложенных саб--кляуз. как оно должно выглядеть -- не совсем понятно. но было бы неплохо.


Код: plsql
1.
update A set (B,C) = case... --то , что нужно!



Но код:
Код: plsql
1.
2.
3.
create temp  table  a (i int, s text);
insert into a values (generate_series(1,10),'s'||generate_series(1,10));
update a set (i,s) = case when i >5 then (i+123, s||'123') end;


дает ошибку:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
ОШИБКА:  ошибка синтаксиса (примерное положение: "case")
LINE 1: update a set (i,s) = case when i > 5 then (i+123, s||'123') ...
                             ^
********** Ошибка **********

ОШИБКА: ошибка синтаксиса (примерное положение: "case")
SQL-состояние: 42601
Символ: 22
...
Рейтинг: 0 / 0
Как в одном запросе обновить поле таблицы расчетным значением другого поля
    #39239160
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bazzz,

да, фокус не удался.

я исходил из фозможности такого, например:
Код: sql
1.
2.
3.
SELECT /*ROW*/(1,'b')
UNION ALL
SELECT CASE WHEN true THEN /*ROW*/(1,'c') ELSE /*ROW*/ (2,'e') END


а на деле SET (a,b)=(v1,v2) видимо не есть SET (a,b)=ROW(v1,v2), а есть частный случай записи поколоночного присвоения, сводимой синтакс--анализатором к стандарту -- т.е. "рыбу заворачивали", как обычно. пичаль. ну дак кейсом больше -- кейсом меньше -- уже в принципе не важно.
...
Рейтинг: 0 / 0
Как в одном запросе обновить поле таблицы расчетным значением другого поля
    #39239245
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫ

предположение , что оптимайзер умнее дерева -- тоже не оправдано:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
--DISCARD ALL;
create temporary  table  a (i int, s text) ;
create function pg_temp.notify_ (X int) RETURNS boolean AS
	$$BEGIN RAISE NOTICE 'X %', X; RETURN TRUE; END;$$ immutable /*STABLE*/ STRICT LANGUAGE plpgsql;
insert into a values (generate_series(1,10),'s'||generate_series(1,10));
update a set
	i = case when i >7 AND pg_temp.notify_ (i) then i+123 else i end
	,s = case when i >7 AND pg_temp.notify_ (i) then s||'123'else s end;
------------------------
ЗАМЕЧАНИЕ:  X 8
ЗАМЕЧАНИЕ:  X 8
ЗАМЕЧАНИЕ:  X 9
ЗАМЕЧАНИЕ:  X 9
ЗАМЕЧАНИЕ:  X 10
ЗАМЕЧАНИЕ:  X 10

Query returned successfully: 10 rows affected, 33 msec execution time.



т.е. таки у ей унутре --неонка галимая.

Пишите через cte.
...
Рейтинг: 0 / 0
Как в одном запросе обновить поле таблицы расчетным значением другого поля
    #39239361
Bazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwqПишите через cte.
по-моему, производительнее будет двойной расчет поля сделать для каждой обновляемой строки,
чем через временную таблицу (она же CTE).
...
Рейтинг: 0 / 0
Как в одном запросе обновить поле таблицы расчетным значением другого поля
    #39239589
PgSQLanonymous2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq
Код: plsql
1.
update A set (B,C) = case... --то , что нужно!



А разве этого не хватит?

Код: plsql
1.
2.
3.
4.
5.
6.
CREATE TABLE t (f1 INT, f2 INT);
INSERT INTO t VALUES (1,2), (3,4), (5,6), (7,8), (9, 0);

UPDATE t 
   SET (f1, f2) = (SELECT n.f1_new, (CASE WHEN t.f1 > 1 AND n.f1_new < 40 THEN n.f1_new ELSE 4 END)
 	             FROM (SELECT CAST((t.f1 * random() + t.f2) AS INT)) AS n(f1_new));
...
Рейтинг: 0 / 0
Как в одном запросе обновить поле таблицы расчетным значением другого поля
    #39239660
Bazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PgSQLanonymous2А разве этого не хватит?

Код: plsql
1.
2.
3.
4.
5.
6.
CREATE TABLE t (f1 INT, f2 INT);
INSERT INTO t VALUES (1,2), (3,4), (5,6), (7,8), (9, 0);

UPDATE t 
   SET (f1, f2) = (SELECT n.f1_new, (CASE WHEN t.f1 > 1 AND n.f1_new < 40 THEN n.f1_new ELSE 4 END)
 	             FROM (SELECT CAST((t.f1 * random() + t.f2) AS INT)) AS n(f1_new));



Наверное, хватит.
Как я понял, Вы предлагаете рассчитав поле f1, положить результат в табличную переменную n с полем f1_new,
а далее использовать ее в явном и не явном (с дальнейшей калькуляцией) виде для обновления f1 и f2, соответственно.
Другого варианта, похоже, нет.
Спасибо!!!
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как в одном запросе обновить поле таблицы расчетным значением другого поля
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]