PostgreSQL рдПрдВрдЯреАрдкреИрдЯрд░реНрди: SQL рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди

SQL C++ рдирд╣реАрдВ рд╣реИ, рди рд╣реА рдпрд╣ JavaScript рд╣реИред рдЗрд╕рд▓рд┐рдП, рддрд╛рд░реНрдХрд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдЕрд▓рдЧ рд╣реИ, рдФрд░ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рд╣реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ:

WHERE fncondX() AND fncondY()

= fncondX() && fncondY()

PostgreSQL рдХреНрд╡реЗрд░реА рдХреА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп рд╕рдорддреБрд▓реНрдп рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ "рдкреБрдирд░реНрд╡реНрдпрд╡рд╕реНрдерд┐рдд" рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреА рднреА рдЧрдгрдирд╛ рди рдХрд░реЗрдВ, рд▓рд╛рдЧреВ рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рд╕реНрдерд┐рддрд┐ рджреЗрдЦреЗрдВ... рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╡реЗ рдХрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рд╣реЛрдВрдЧреЗ (рдФрд░ рдХреНрдпрд╛ рдЙрдирдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рдПрдЧреА) рдиреНрдпрд╛рдпрд╕рдВрдЧрдд рд╕реНрдерд┐рддрд┐рдпрд╛рдБред

рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЗрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдЕрд╕рдорд╛рди рдмрдирд╛рдПрдВ рд╕рд╢рд░реНрдд рдХреЗ рд╕рд╛рде рднрд╛рд╡ ╨╕ рдСрдкрд░реЗрдЯрд░реЛрдВ.

PostgreSQL рдПрдВрдЯреАрдкреИрдЯрд░реНрди: SQL рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди
рдбреЗрдЯрд╛ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣реА рдЖрдзрд╛рд░ рд╣реИ рд╣рдорд╛рд░реЗ рд╡реАрдПрд▓рдПрд╕рдЖрдИ рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕ рдХрд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЙрди рдкрд░ рд╕рдВрдЪрд╛рд▓рди рди рдХреЗрд╡рд▓ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдмрд▓реНрдХрд┐ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рднреА рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЖрдЗрдП рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ рдЬрд╣рд╛рдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореВрд▓реНрдпрд╛рдВрдХрди рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдФрд░ рдЬрд╣рд╛рдВ рдЙрдирдХреА рджрдХреНрд╖рддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред

#0: рдЖрд░рдЯреАрдПрдлрдПрдо

рд╢реБрд░реБрдЖрдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд╕реЗ рдЙрджрд╛рд╣рд░рдг:

рдЬрдм рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд╛ рдХреНрд░рдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ, рддреЛ рдЗрд╕реЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ CASE. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рд╡рд╛рдХреНрдп рдореЗрдВ рд╢реВрдиреНрдп рд╕реЗ рд╡рд┐рднрд╛рдЬрди рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдпрд╣ рддрд░реАрдХрд╛ WHERE рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп:

SELECT ... WHERE x > 0 AND y/x > 1.5;

рд╕реБрд░рдХреНрд╖рд┐рдд рд╡рд┐рдХрд▓реНрдк:

SELECT ... WHERE CASE WHEN x > 0 THEN y/x > 1.5 ELSE false END;

рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдирд┐рд░реНрдорд╛рдг CASE рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдЕрдиреБрдХреВрд▓рди рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддрднреА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдЖрд╡рд╢реНрдпрдХ рд╣реЛред

#1: рдЯреНрд░рд┐рдЧрд░ рд╕реНрдерд┐рддрд┐

BEGIN
  IF cond(NEW.fld) AND EXISTS(SELECT ...) THEN
    ...
  END IF;
  RETURN NEW;
END;

рд╕рдм рдХреБрдЫ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди... рдХреЛрдИ рднреА рд╡рд╛рджрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рдХрд┐ рдирд┐рд╡реЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ SELECT рдпрджрд┐ рдкрд╣рд▓реА рд╢рд░реНрдд рдЭреВрдареА рд╣реИ рддреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВ рдиреЗрд╕реНрдЯ IF:

BEGIN
  IF cond(NEW.fld) THEN
    IF EXISTS(SELECT ...) THEN
      ...
    END IF;
  END IF;
  RETURN NEW;
END;

рдЖрдЗрдП рдЕрдм рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦреЗрдВ - рдЯреНрд░рд┐рдЧрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреВрд░рд╛ рд╢рд░реАрд░ "рд▓рд┐рдкрдЯреЗ" рдореЗрдВ рдирд┐рдХрд▓рд╛ IF. рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдЪреАрдЬрд╝ рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрддреА рд╣реИ WHEN-рд╕реНрдерд┐рддрд┐рдпрд╛рдБ:

BEGIN
  IF EXISTS(SELECT ...) THEN
    ...
  END IF;
  RETURN NEW;
END;
...
CREATE TRIGGER ...
  WHEN cond(NEW.fld);

рдпрджрд┐ рд╕реНрдерд┐рддрд┐ рдЧрд▓рдд рд╣реИ рддреЛ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдкрдХреЛ рдЧрд╛рд░рдВрдЯреА рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

#2: рдпрд╛/рддрдерд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛

SELECT ... WHERE EXISTS(... A) OR EXISTS(... B)

рдЕрдиреНрдпрдерд╛, рдпрд╣ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ EXISTS рд╕рдЪ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рджреЛрдиреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛.

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ "рд╕рддреНрдп" рд╣реИ (рдпрд╛ "рдЭреВрдард╛" - рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП AND-рдЪреЗрди) - рдХреНрдпрд╛ рдХрд┐рд╕реА рддрд░рд╣ "рдЕрдкрдиреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдмрдврд╝рд╛рдирд╛" рд╕рдВрднрд╡ рд╣реИ рддрд╛рдХрд┐ рджреВрд╕рд░рд╛ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рди рд╣реЛ?

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ - рдПрд▓реНрдЧреЛрд░рд┐рдердо рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓реЗрдЦ рдХреЗ рд╡рд┐рд╖рдп рдХреЗ рдХрд░реАрдм рд╣реИ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдПрд╕рдХреНрдпреВрдПрд▓ рдПрдВрдЯреАрдкреИрдЯрд░реНрди: рджреБрд░реНрд▓рдн рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЬреЙрдЗрди рдХреЗ рдордзреНрдп рддрдХ рдкрд╣реБрдВрдЪрддреА рд╣реИ.

рдЖрдЗрдП рдЗрди рджреЛрдиреЛрдВ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ "CASE рдХреЗ рдЕрдВрддрд░реНрдЧрдд рд░рдЦреЗрдВ":

SELECT ...
WHERE
  CASE
    WHEN EXISTS(... A) THEN TRUE
    WHEN EXISTS(... B) THEN TRUE
  END

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдордиреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ ELSE-рдореВрд▓реНрдп, рдЕрд░реНрдерд╛рдд, рдпрджрд┐ рджреЛрдиреЛрдВ рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рдЧрд▓рдд рд╣реИрдВ CASE рд▓реМрдЯ рдЖрдПрдЧрд╛ NULL, рдЬрд┐рд╕рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИ FALSE ╨▓ WHERE- рд╕реНрдерд┐рддрд┐рдпрд╛рдБред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рд╕реНрд╡рд╛рдж рдФрд░ рд░рдВрдЧ рдХреЗ рд▓рд┐рдП:

SELECT ...
WHERE
  CASE
    WHEN NOT EXISTS(... A) THEN EXISTS(... B)
    ELSE TRUE
  END

#3: рд╢рд░реНрддреЗрдВ рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВ [рдирд╣реАрдВ]

рд╣рдордиреЗ рдЗрд╕ рдЯреНрд░рд┐рдЧрд░ рдХреЗ "рдЕрдЬреАрдм" рдЯреНрд░рд┐рдЧрд░ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рджреЛ рджрд┐рди рдмрд┐рддрд╛рдП - рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХреНрдпреЛрдВред

рд╕реНрд░реЛрдд:

IF( NEW."╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В_" is null or NEW."╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В_" = (select '"╨Ъ╨╛╨╝╨┐╨╗╨╡╨║╤В"'::regclass::oid) or NEW."╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В_" = (select to_regclass('"╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨Я╨╛╨Ч╨░╤А╨┐╨╗╨░╤В╨╡"')::oid)
     AND (   OLD."╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨Э╨░╤И╨░╨Ю╤А╨│╨░╨╜╨╕╨╖╨░╤Ж╨╕╤П" <> NEW."╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨Э╨░╤И╨░╨Ю╤А╨│╨░╨╜╨╕╨╖╨░╤Ж╨╕╤П"
          OR OLD."╨г╨┤╨░╨╗╨╡╨╜" <> NEW."╨г╨┤╨░╨╗╨╡╨╜"
          OR OLD."╨Ф╨░╤В╨░" <> NEW."╨Ф╨░╤В╨░"
          OR OLD."╨Т╤А╨╡╨╝╤П" <> NEW."╨Т╤А╨╡╨╝╤П"
          OR OLD."╨Ы╨╕╤Ж╨╛╨б╨╛╨╖╨┤╨░╨╗" <> NEW."╨Ы╨╕╤Ж╨╛╨б╨╛╨╖╨┤╨░╨╗" ) ) THEN ...

рд╕рдорд╕реНрдпрд╛ #1: рдЕрд╕рдорд╛рдирддрд╛ рд╢реВрдиреНрдп рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрдирддреА

рдЪрд▓рд┐рдП рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдмрдХреБрдЫ OLD-рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдорд╣рддреНрд╡ рдерд╛ NULL. рдХреНрдпрд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛?

SELECT NULL <> 1 OR NULL <> 2;
-- NULL

рдФрд░ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рджреГрд╖реНрдЯрд┐ рд╕реЗ NULL рдмрд░рд╛рдмрд░ FALSE, рдЬреИрд╕рд╛ рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╣реИред

рд╕рдорд╛рдзрд╛рди: рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ IS DISTINCT FROM рд╕реЗ ROW-рдСрдкрд░реЗрдЯрд░, рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рд░рд┐рдХреЙрд░реНрдб рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛:

SELECT (NULL, NULL) IS DISTINCT FROM (1, 2);
-- TRUE

рд╕рдорд╕реНрдпрд╛ рд╕рдВрдЦреНрдпрд╛ 2: рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рднрд┐рдиреНрди-рднрд┐рдиреНрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдХреЗ рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ:

NEW."╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В_" = (select '"╨Ъ╨╛╨╝╨┐╨╗╨╡╨║╤В"'::regclass::oid)
NEW."╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В_" = (select to_regclass('"╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨Я╨╛╨Ч╨░╤А╨┐╨╗╨░╤В╨╡"')::oid)

рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд╡реЗрд╢ рдХреНрдпреЛрдВ рд╣реИрдВ? SELECT? рдПрдХ рд╕рдорд╛рд░реЛрд╣ to_regclass? рдпрд╣ рдЕрд▓рдЧ рдХреНрдпреЛрдВ рд╣реИ...

рдЖрдЗрдП рдареАрдХ рдХрд░реЗрдВ:

NEW."╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В_" = '"╨Ъ╨╛╨╝╨┐╨╗╨╡╨║╤В"'::regclass::oid
NEW."╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В_" = '"╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨Я╨╛╨Ч╨░╤А╨┐╨╗╨░╤В╨╡"'::regclass::oid

рд╕рдорд╕реНрдпрд╛ #3: рдмреВрд▓ рдкреНрд░рд╛рдердорд┐рдХрддрд╛

рдЖрдЗрдП рд╕реНрд░реЛрдд рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░реЗрдВ:

{... IS NULL} OR
{... ╨Ъ╨╛╨╝╨┐╨╗╨╡╨║╤В} OR
{... ╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨Я╨╛╨Ч╨░╤А╨┐╨╗╨░╤В╨╡} AND
( {... ╨╜╨╡╤А╨░╨▓╨╡╨╜╤Б╤В╨▓╨░} )

рдЙрдлрд╝... рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдкрд╣рд▓реА рджреЛ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЗ рд╕рддреНрдп рд╣реЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкреВрд░реА рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ TRUE, рдЕрд╕рдорд╛рдирддрд╛рдУрдВ рдХреА рдкрд░рд╡рд╛рд╣ рди рдХрд░рддреЗ рд╣реБрдПред рдФрд░ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬреИрд╕рд╛ рд╣рдо рдЪрд╛рд╣рддреЗ рдереЗред

рдЖрдЗрдП рдареАрдХ рдХрд░реЗрдВ:

(
  {... IS NULL} OR
  {... ╨Ъ╨╛╨╝╨┐╨╗╨╡╨║╤В} OR
  {... ╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨Я╨╛╨Ч╨░╤А╨┐╨╗╨░╤В╨╡}
) AND
( {... ╨╜╨╡╤А╨░╨▓╨╡╨╜╤Б╤В╨▓╨░} )

рд╕рдорд╕реНрдпрд╛ #4 (рдЫреЛрдЯреА): рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдЬрдЯрд┐рд▓ рдпрд╛ рд╕реНрдерд┐рддрд┐

рджрд░рдЕрд╕рд▓, рд╣рдореЗрдВ рдирдВрдмрд░ 3 рдореЗрдВ рджрд┐рдХреНрдХрдд рдЗрд╕рд▓рд┐рдП рд╣реБрдИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣рд╛рдВ рддреАрди рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдереАрдВред рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдмрдЬрд╛рдп, рдЖрдк рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдПрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ coalesce ... IN:

coalesce(NEW."╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В_"::text, '') IN ('', '"╨Ъ╨╛╨╝╨┐╨╗╨╡╨║╤В"', '"╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨Я╨╛╨Ч╨░╤А╨┐╨╗╨░╤В╨╡"')

рдФрд░ рд╣рдо рдЗрд╕реАрд▓рд┐рдП NULL "рдкрдХрдбрд╝реЛ", рдФрд░ рдЬрдЯрд┐рд▓ OR рдЖрдкрдХреЛ рдХреЛрд╖реНрдардХреЛрдВ рдХреЗ рд╕рд╛рде рдЭрдВрдЭрдЯ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░

рдЖрдЗрдП рдЙрд╕реЗ рдареАрдХ рдХрд░реЗрдВ рдЬреЛ рд╣рдореЗрдВ рдорд┐рд▓рд╛:

IF (
  coalesce(NEW."╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В_"::text, '') IN ('', '"╨Ъ╨╛╨╝╨┐╨╗╨╡╨║╤В"', '"╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨Я╨╛╨Ч╨░╤А╨┐╨╗╨░╤В╨╡"') AND
  (
    OLD."╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨Э╨░╤И╨░╨Ю╤А╨│╨░╨╜╨╕╨╖╨░╤Ж╨╕╤П"
  , OLD."╨г╨┤╨░╨╗╨╡╨╜"
  , OLD."╨Ф╨░╤В╨░"
  , OLD."╨Т╤А╨╡╨╝╤П"
  , OLD."╨Ы╨╕╤Ж╨╛╨б╨╛╨╖╨┤╨░╨╗"
  ) IS DISTINCT FROM (
    NEW."╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨Э╨░╤И╨░╨Ю╤А╨│╨░╨╜╨╕╨╖╨░╤Ж╨╕╤П"
  , NEW."╨г╨┤╨░╨╗╨╡╨╜"
  , NEW."╨Ф╨░╤В╨░"
  , NEW."╨Т╤А╨╡╨╝╤П"
  , NEW."╨Ы╨╕╤Ж╨╛╨б╨╛╨╖╨┤╨░╨╗"
  )
) THEN ...

рдФрд░ рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЗрд╕ рдЯреНрд░рд┐рдЧрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдореЗрдВ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ UPDATEрдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд╛рд░рдг рдЯреНрд░рд┐рдЧрд░ OLD/NEW рдКрдкрд░реА рд╕реНрддрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рддреЛ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЖрдо рддреМрд░ рдкрд░ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ WHEN-рд╕реНрдерд┐рддрд┐ рдЬреИрд╕рд╛ рдХрд┐ #1 рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ...

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ