Da sh означает доступ между оператором if и преобразованием его в PostgreSQL - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть запрос, который я получил из базы данных доступа, которую я пытаюсь записать в postgreSQL. У меня проблемы с переводом этой строки iif(isNull(table2.salaried), 0, table2.salaried) - iif(isNull(table1.paymet_due), 0, table1.paymet_due) AS salary_due в PostgreSQL. Первое, что меня смущает, это - в запросе. Что это значит? Как я могу преобразовать эту строку в PostgreSQL?

SELECT
   * 
FROM
   (
      SELECT
         table1."customer_id",
         iif(isNull(table2.salaried), 0, table2.salaried) - iif(isNull(table1.paymet_due), 0, table1.paymet_due) AS salary_due 
       --coalesce(table1.paymet_due, 0) AS salary_due

      FROM
         (
            SELECT
               tbl_archive."customer_id",
               SUM(tbl_sent."grand_total_paymet_due") AS paymet_due 
            FROM
               tbl_sent 
               LEFT JOIN
                  tbl_archive 
                  ON tbl_sent."npi" = tbl_archive."cust_badge_numb" 
         )
         AS table1 
         LEFT JOIN
            (
               SELECT
                  tbl_archive."customer_id",
                  SUM(wage."Amount") AS salaried 
               FROM
                  wage 
                  LEFT JOIN
                     tbl_archive 
                     ON wage."sum_amount" = tbl_archive."cust_badge_numb" 
            )
            AS table2 
            ON table1."customer_id" = table2."customer_id"
   )
   AS tbl_salaried

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

Это простое вычитание:

  • Значение A равно 0, если table2.salaried равно NULL, в противном случае оно равно table2.salaried.

  • Значение B равно 0, если table1.paymetdue равно NULL, в противном случае оно равно table1.paymetdue.

И значение, показанное в запросе, является значением A минус значение B.

Таким образом, правильный перевод будет

coalesce(table2.salaried, 0) - coalesce(table1.paymet_due, 0)
1 голос
/ 21 апреля 2020

Вы можете использовать функцию coalesce, которая возвращает первый ненулевой аргумент.

Например:

coalesce(field1,field2,0) - will return field 1 unless it's null. If field1 is null, it will return field2 unless it's null. If both field1 and field2 are null, it will return 0.

В вашем случае вы можете использовать: coalesce(table2.salaried, 0) вместо iif(isNull(table2.salaried), 0, table2.salaried)

Что касается -, это действительно зависит от того, являются ли поля числительными c или датами.

  • Для чисел c - вы можете оставить - как есть.
  • Для дат - вы должны знать, что конкретно вы хотите извлечь - количество дней / месяцев / et c между датами ...
...