pgsql - не получается портировать запрос для postgressql с if then в сортировке
Не получается изменить запрос с mysql на pgsql.
Ошибка конкретно в сортировке на условии:
SELECT
"modTransportPackage".*,
"Provider"."name" AS "provider_name"
FROM
"modx_transport_packages" AS "modTransportPackage"
LEFT JOIN "modx_transport_providers" "Provider" ON modTransportPackage.provider = Provider.ID
WHERE
(
"modTransportPackage"."workspace" = 1
AND (
SELECT
"signature"
FROM
"modx_transport_packages" AS "latestPackage"
WHERE
"latestPackage"."package_name" = "modTransportPackage"."package_name"
ORDER BY
"latestPackage"."version_major" DESC,
"latestPackage"."version_minor" DESC,
"latestPackage"."version_patch" DESC,
IF
( "release" = '' OR "release" = 'ga' OR "release" = 'pl', 'z', IF ( "release" = 'dev', 'a', "release" ) ) DESC,
"latestPackage"."release_index" DESC
LIMIT 1
) = "modTransportPackage"."signature"
)
ORDER BY
"modTransportPackage"."signature" ASC
LIMIT 20
Пробовал что-то по типу:
CASE
"release" WHEN ''
OR "release" WHEN 'ga'
OR "release" WHEN 'pl'
THEN 'z'
ELSE
CASE
"release" WHEN 'dev'
THEN 'a'
ELSE "release"
END
END
DESC
Ответы (1 шт):
Автор решения: Akina
→ Ссылка
IF - это конструкция, которая используется в хранимых объектах (процедуры, триггеры и пр.).
Её аналогом, применяемым в выражениях запроса, является CASE. Т.е. вместо
IF ( "release" = '' OR "release" = 'ga' OR "release" = 'pl',
'z',
IF ( "release" = 'dev',
'a',
"release"
)
) DESC
следует использовать, например
CASE "release" WHEN '' THEN 'z'
WHEN 'ga' THEN 'z'
WHEN 'pl' THEN 'z'
WHEN 'dev' THEN 'a'
ELSE "release"
END DESC
или
CASE WHEN "release" IN ('', 'ga', 'pl') THEN 'z'
WHEN "release" = 'dev' THEN 'a'
ELSE "release"
END DESC
Ваш вариант был близок к правильному. Надо было просто попристальнее посмотреть на синтаксис.