PostgreSQL Antipatterns: SQL рдореЗрдВ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рдЧрдгрдирд╛

SQL C ++ рдирд╣реАрдВ рд╣реИ, рди рд╣реА JavaScriptред рдЗрд╕рд▓рд┐рдП, рддрд╛рд░реНрдХрд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдЕрд▓рдЧ рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рд╣реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ:
WHERE fncondX() AND fncondY()
= fncondX() && fncondY()

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

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


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

# 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-condition рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИ :

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рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП "рдЭреВрдард╛" ) рд╣реИ, рддреЛ рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рддрд░рд╣ "рдЕрдкрдиреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдмрдврд╝рд╛рдПрдВ" рддрд╛рдХрд┐ рджреВрд╕рд░рд╛ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рди рдХрд░реЗ?

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

рдЖрдЗрдП рдЗрди рджреЛрдиреЛрдВ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ "рдкреЙрдк рдЗрди рдХреИрд╕" рджреЗрдЦреЗрдВ:

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-condition рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ , рдЬреИрд╕рд╛ рдХрд┐ # 1 рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ ...

All Articles