Я перемещаю нашу серверную базу данных с mysql на postgres и нахожусь в процессе переноса всех наших старых запросов/функций. Большинство из них тривиальны, но сегодня я наткнулся на один, который заставил меня почесать голову. Вот:
UPDATE
k_coderound AS cr, k_coderound AS cr_m
SET
cr.is_correct = IF(
(SELECT GROUP_CONCAT(option_id ORDER BY variable_id) AS `values` FROM k_value
WHERE code_round_id=cr.id GROUP BY code_round_id) =
(SELECT GROUP_CONCAT(option_id ORDER BY variable_id) AS `values` FROM k_value
WHERE code_round_id=cr_m.id GROUP BY code_round_id),
1,
0
)
WHERE
cr.is_master=0
AND cr_m.is_master=1
AND cr_m.object_id=cr.object_id
AND cr_m.content_type_id =cr.content_type_id
Я знаю, что в Postgres нет group_concat, и вместо этого следует использовать array_agg. Моя проблема в том, что я не могу понять, что именно происходит - этот запрос был написан много лет назад кем-то, кого с нами больше нет. Также это усложняет отсутствие оператора IF в Postgres. Если кто-то может дать отзыв или совет, буду очень признателен!
option_id
,variable_id
иcode_round_id
? Они принадлежатk_value
? - person ypercubeᵀᴹ   schedule 12.06.2012IF
обычно преобразуется вCASE
в PostgreSQL (и любой другой стандартной базе данных SQL) - person a_horse_with_no_name   schedule 12.06.2012