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: OR/AND-ΡΠ΅ΠΏΠΎΡΠΊΠ°
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: ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ bool-ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ
ΠΡΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ΅ΠΌ ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊ:
{... IS NULL} OR
{... ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ} OR
{... ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅} AND
( {... Π½Π΅ΡΠ°Π²Π΅Π½ΡΡΠ²Π°} )
Π£ΠΏΡβ¦ ΠΠΎ ΡΠ°ΠΊΡΡ, ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ, ΡΡΠΎ Π² ΡΠ»ΡΡΠ°Π΅ ΠΈΡΡΠΈΠ½Π½ΠΎΡΡΠΈ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΈΠ· Π΄Π²ΡΡ
ΠΏΠ΅ΡΠ²ΡΡ
ΡΡΠ»ΠΎΠ²ΠΈΠΉ, Π²ΡΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ ΠΎΠ±ΡΠ°ΡΠ°Π΅ΡΡΡ Π² TRUE
, Π±Π΅Π· ΡΡΠ΅ΡΠ° Π½Π΅ΡΠ°Π²Π΅Π½ΡΡΠ². Π ΡΡΠΎ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ ΡΠΎ, ΡΠ΅Π³ΠΎ ΠΌΡ Ρ
ΠΎΡΠ΅Π»ΠΈ.
ΠΡΠΏΡΠ°Π²ΠΈΠΌ:
(
{... IS NULL} OR
{... ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ} OR
{... ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅}
) AND
( {... Π½Π΅ΡΠ°Π²Π΅Π½ΡΡΠ²Π°} )
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° β4 (ΠΌΠ°Π»Π΅Π½ΡΠΊΠ°Ρ): ΡΠ»ΠΎΠΆΠ½ΠΎΠ΅ OR-ΡΡΠ»ΠΎΠ²ΠΈΠ΅ Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Ρ
Π‘ΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π² β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β¦
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com