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
-chains) - ααΎααΆα’αΆα
αα
αα½α
αααααααααΆααΎααααΈ "αααααΎαα’αΆαα·ααΆαααααααΆ" ααΌα
ααααααΆααΈααΈααα·αααααΌαααΆαααααα·ααααα·ααααααααα?
ααΆααααααΆααΆα’αΆα
αα
αα½α
- αα·ααΈααΆααααααααααα½ααααααααΆαααΊαα
αα·ααααααΆαααααα’ααααα
α αΌαααΎαααααΆαααα "shove under CASE" ααααααααααΆααααΈααααα
SELECT ...
WHERE
CASE
WHEN EXISTS(... A) THEN TRUE
WHEN EXISTS(... B) THEN TRUE
END
αααα»αααααΈαααααΎααα·αααΆααααααααα ELSE
-value αααααΊααααα·αααΎααααααααααΆααααΈααα·ααα·α 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 (ααΌα )α αααααααααααα»αααααΆα 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
-ααααααααααΌα
αααα αΆααααα»ααααα‘...
ααααα: www.habr.com