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
-рдкрд░рд┐рд╕реНрдерд┐рддреА
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: рдЕрд╕рдорд╛рдирддрд╛ 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