pgsql - не получается портировать запрос для postgressql с if then в сортировке

Рейтинг: 1Ответов: 1Опубликовано: 16.05.2023

Не получается изменить запрос с 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Принят

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

Ваш вариант был близок к правильному. Надо было просто попристальнее посмотреть на синтаксис.