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 (แแแขแแ แ): แ แแฃแแ แแ แแแ แแแ แแ แแ แแแแแกแแแแก
แคแแฅแขแแฃแ แแ แแ-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