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) - เบกเบฑเบเปเบเบฑเบเปเบเปเบเปเปเบเบงเปเบเบเบตเปเบเบฐ "เปเบเบตเปเบกเบเบงเบฒเบกเบชเปเบฒเบเบฑเบเบเบญเบเบกเบฑเบ" เปเบเบทเปเบญเบงเปเบฒเบญเบฑเบเบเบตเบชเบญเบเบเปเปเปเบเปเบเบทเบเบเบฐเบเบดเบเบฑเบเบญเบตเบเปเบเบทเปเบญเบซเบเบถเปเบเบเป?
เบกเบฑเบ turns เปเบซเปเปเบซเบฑเบเบงเปเบฒเบกเบฑเบเปเบเบฑเบเปเบเปเบเป - เบงเบดเบเบตเบเบฒเบ algorithmic เปเบกเปเบเปเบเปเบเบดเบเบเบฑเบเบซเบปเบงเบเปเปเบเบญเบเบเบปเบเบเบงเบฒเบก
เปเบซเปเบเบฝเบเปเบเป "shove" เบเบฑเบเบชเบญเบเปเบเบทเปเบญเบเปเบเปเบซเบผเบปเปเบฒเบเบตเปเบเบฒเบเปเบเปเบเปเบฅเบฐเบเบต:
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
-fields เบกเบตโเบเบงเบฒเบกโเบซเบกเบฒเบโ 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 ...
เปเบฅเบฐเบเปเบฒเบเปเบฒเบเบเบดเบเบฒเบฅเบฐเบเบฒเบงเปเบฒเบเบฑเบเบเบฑเบ trigger เบเบตเปเบชเบฒเบกเบฒเบเปเบเปเปเบเปเบเบฝเบเปเบเปเปเบ UPDATE
- เบเบปเบโเบเบฐโเบเบปเบโเปเบเบทเปเบญเบโเบเบฒเบโเบกเบตโ OLD/NEW
เบขเบนเปเปเบเบชเบฐเบเบฒเบเบฅเบฐเบเบฑเบเปเบเบดเบ, เปเบเบเบเบปเปเบงเปเบเปเบฅเปเบงเบชเบฐเบเบฒเบเบเบฒเบเบเบตเปเบชเบฒเบกเบฒเบเบเบทเบเบงเบฒเบเปเบงเปเปเบ WHEN
- เบชเบฐโเบเบฒเบโเบเบฒเบโ, เบเบฑเปเบโเบเบตเปโเบชเบฐโเปเบเบโเปเบซเปโเปเบซเบฑเบโเปเบ #1 ...
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com