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...
ืืงืืจ: www.habr.com