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
-เชเซเชเชจเซเชธ) - เชถเซเช เชเซเชเช เชฐเซเชคเซ "เชคเซเชจเซ เชชเซเชฐเชพเชงเชพเชจเซเชฏเชคเชพ เชตเชงเชพเชฐเชตเซ" เชถเชเซเชฏ เชเซ เชเซเชฅเซ เชฌเซเชเซ เชตเชพเชฐ เชซเชฐเซเชฅเซ เช
เชฎเชฒเชฎเชพเช เชจ เชเชตเซ?
เชคเซ เชคเชพเชฐเชฃ เชเชชเซ เชเซ เชเซ เชคเซ เชถเชเซเชฏ เชเซ - เช
เชฒเซเชเซเชฐเชฟเชงเชฎเชฟเชเชฒ เช
เชญเชฟเชเชฎ เชฒเซเชเชจเชพ เชตเชฟเชทเชฏเชจเซ เชจเชเซเช เชเซ
เชเชพเชฒเซ เช เชฌเชเชจเซ เชถเชฐเชคเซเชจเซ เชซเชเซเชค "เชเซเชธ เชนเซเช เชณ เชงเชเซเชเซ เชฎเชพเชฐเซเช":
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