рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдПрд╕рдХреНрдпреВрдПрд▓ рдЕрдБрдЯреАрдкреЕрдЯрд░реНрди: рдПрд╕рдХреНрдпреВрдПрд▓рдордзреАрд▓ рдкрд░рд┐рд╕реНрдерд┐рддреАрдВрдЪреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдгреЗ

SQL C++ рдирд╛рд╣реА, рдЖрдгрд┐ JavaScript рдирд╛рд╣реА. рдореНрд╣рдгреВрди, рддрд╛рд░реНрдХрд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддреАрдВрдЪреА рдЧрдгрдирд╛ рд╡реЗрдЧрд│реНрдпрд╛ рдкреНрд░рдХрд╛рд░реЗ рд╣реЛрддреЗ рдЖрдгрд┐ рд╣реЗ рд╕рд░реНрд╡ рд╕рдорд╛рди рдирд╛рд╣реА:

WHERE fncondX() AND fncondY()

= fncondX() && fncondY()

PostgreSQL рдХреНрд╡реЗрд░реА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдпреЛрдЬрдирд╛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЭ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрдд рд╕реНрд╡реИрд░рдкрдгреЗ рд╕рдорддреБрд▓реНрдп рдкрд░рд┐рд╕реНрдерд┐рддреА "рдкреБрдирд░реНрд░рдЪрдирд╛" рдХрд░реВ рд╢рдХрддреЗ, рддреНрдпрд╛рддреАрд▓ рдХрд╛рд╣реА рд╡реИрдпрдХреНрддрд┐рдХ рдиреЛрдВрджреАрдВрд╕рд╛рдареА рдореЛрдЬреВ рдирдХрд╛, рддреНрдпрд╛рдВрдирд╛ рд▓рд╛рдЧреВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХрд╛рдЪреНрдпрд╛ рдЕрдЯреАрдВрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдХрд░рд╛... рдереЛрдбрдХреНрдпрд╛рдд, рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкрд╛ рдорд╛рд░реНрдЧ рдореНрд╣рдгрдЬреЗ рддреБрдореНрд╣реА рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА рддреЗ рдХреЛрдгрддреНрдпрд╛ рдХреНрд░рдорд╛рдиреЗ рдХрд░рддреАрд▓ (рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреА рдЧрдгрдирд╛ рдХреЗрд▓реА рдЬрд╛рдИрд▓ рдХреА рдирд╛рд╣реА) рд╕рдорд╛рди рдкрд░рд┐рд╕реНрдерд┐рддреА.

рдореНрд╣рдгреВрди, рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрдЬреВрдирд╣реА рдкреНрд░рд╛рдзрд╛рдиреНрдп рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛рдпрдЪреЗ рдЕрд╕реЗрд▓, рддрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рддреНрдпрд╛рдЪреА рд░рдЪрдирд╛ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдпрд╛ рдЕрдЯреА рдЕрд╕рдорд╛рди рдХрд░рд╛ рд╕рд╢рд░реНрдд рд╡рд╛рдкрд░рдгреЗ рдЕрднрд┐рд╡реНрдпрдХреНрддреА ╨╕ рдСрдкрд░реЗрдЯрд░.

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

#0: RTFM

рд╕реБрд░реВ рд╣реЛрдд рдЖрд╣реЗ рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдгрд╛рддреАрд▓ рдЙрджрд╛рд╣рд░рдг:

рдЬреЗрд╡реНрд╣рд╛ рдореВрд▓реНрдпрдорд╛рдкрдирд╛рдЪрд╛ рдХреНрд░рдо рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ рдЕрд╕рддреЛ, рддреЗрд╡реНрд╣рд╛ рддреЗ рд░рдЪрдирд╛ рд╡рд╛рдкрд░реВрди рдХреЕрдкреНрдЪрд░ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ 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-рдЪреЗрдиреНрд╕) - рдХрд╕рд╛ рддрд░реА "рддреНрдпрд╛рдЪрд╛ рдкреНрд░рд╛рдзрд╛рдиреНрдпрдХреНрд░рдо рд╡рд╛рдврд╡рдгреЗ" рд╢рдХреНрдп рдЖрд╣реЗ рдЬреЗрдгреЗрдХрд░реБрди рджреБрд╕рд░рд╛ рдкреБрдиреНрд╣рд╛ рдЕрдВрдорд▓рд╛рдд рдЖрдгрд▓рд╛ рдЬрд╛рдгрд╛рд░ рдирд╛рд╣реА?

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

рдЪрд▓рд╛ рдпрд╛ рджреЛрдиреНрд╣реА рдЕрдЯреА рдлрдХреНрдд 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: рдЕрд╕рдорд╛рдирддрд╛ NULL рдЪрд╛ рдЖрджрд░ рдХрд░рдд рдирд╛рд╣реА

рдЪрд▓рд╛ рдХрд▓реНрдкрдирд╛ рдХрд░реВрдпрд╛ рдХреА рд╕рд░реНрд╡рдХрд╛рд╣реА 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛