SQL tsis yog C ++, tsis yog JavaScript. Yog li ntawd, qhov kev ntsuam xyuas ntawm cov lus piav qhia yog txawv, thiab qhov no tsis yog tib yam nkaus:
WHERE fncondX() AND fncondY()
= fncondX() && fncondY()
Thaum optimizing txoj kev npaj ua tiav ntawm PostgreSQL cov lus nug
Yog li ntawd, yog tias koj tseem xav tswj hwm qhov tseem ceeb, koj yuav tsum tau ua kom zoo ua rau cov xwm txheej no tsis sib xws nrog conditional
Cov ntaub ntawv thiab ua haujlwm nrog lawv yog lub hauv paus
#0: RTFM
Pib
Thaum qhov kev txiav txim ntawm kev ntsuam xyuas tseem ceeb, nws tuaj yeem kho nrog kev tsim kho
CASE
. Piv txwv li, txoj kev no kom tsis txhob faib los ntawm xoom hauv kab lusWHERE
tsis ntseeg siab:SELECT ... WHERE x > 0 AND y/x > 1.5;
Kev xaiv nyab xeeb:
SELECT ... WHERE CASE WHEN x > 0 THEN y/x > 1.5 ELSE false END;
Kev tsim kho siv
CASE
tiv thaiv cov lus qhia los ntawm optimization, yog li nws yuav tsum tsuas yog siv thaum tsim nyog.
# 1: qhov ua rau mob
BEGIN
IF cond(NEW.fld) AND EXISTS(SELECT ...) THEN
...
END IF;
RETURN NEW;
END;
Txhua yam zoo li zoo, tab sis ... Tsis muaj leej twg cog lus tias qhov kev nqis peev SELECT
yuav tsis raug tua yog tias thawj qhov xwm txheej tsis tseeb. Kho nws nrog ua zes IF
:
BEGIN
IF cond(NEW.fld) THEN
IF EXISTS(SELECT ...) THEN
...
END IF;
END IF;
RETURN NEW;
END;
Tam sim no cia saib ua tib zoo - tag nrho lub cev ntawm qhov ua haujlwm ua haujlwm tau muab "pob" rau hauv IF
. Thiab qhov no txhais tau hais tias tsis muaj dab tsi tiv thaiv peb ntawm kev tshem tawm tus mob no los ntawm txoj kev siv WHEN
- yam mob
BEGIN
IF EXISTS(SELECT ...) THEN
...
END IF;
RETURN NEW;
END;
...
CREATE TRIGGER ...
WHEN cond(NEW.fld);
Txoj hauv kev no tso cai rau koj kom txuag tau cov peev txheej server nrog kev lees paub yog tias qhov xwm txheej tsis raug.
# 2: LOS YOG / THIAB saw
SELECT ... WHERE EXISTS(... A) OR EXISTS(... B)
Txwv tsis pub, nws tuaj yeem tau txais tias ob qho tib si EXISTS
yuav muaj tseeb, tab sis ob leeg yuav raug tua.
Tab sis yog tias peb paub tseeb tias ib qho ntawm lawv yog "tseeb" ntau zaus (lossis "false" - rau AND
-chains) - nws puas tuaj yeem ua "nce nws qhov tseem ceeb" kom qhov thib ob tsis raug tua ib zaug ntxiv?
Nws hloov tawm hais tias nws yog ua tau - lub algorithmically mus kom ze yog ze rau lub ntsiab lus ntawm tsab xov xwm
Cia li "shove under CASE" ob qho tib si ntawm cov xwm txheej no:
SELECT ...
WHERE
CASE
WHEN EXISTS(... A) THEN TRUE
WHEN EXISTS(... B) THEN TRUE
END
Hauv qhov no, peb tsis tau txhais ELSE
-value, uas yog, yog tias ob qho xwm txheej tsis tseeb CASE
yuav rov qab los NULL
, uas yog txhais raws li FALSE
Π² WHERE
- tej yam kev mob.
Qhov piv txwv no tuaj yeem ua ke rau lwm txoj hauv kev - kom saj thiab xim:
SELECT ...
WHERE
CASE
WHEN NOT EXISTS(... A) THEN EXISTS(... B)
ELSE TRUE
END
#3: yuav ua li cas [tsis] sau tej yam kev mob
Peb tau siv sijhawm ob hnub los tshuaj xyuas cov laj thawj rau qhov "kev txawv txav" ntawm qhov ua rau qhov no - cia saib yog vim li cas.
Qhov chaw:
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 ...
Teeb meem #1: Kev tsis sib xws tsis suav rau NULL
Cia peb xav tias txhua yam OLD
- teb tseem ceeb NULL
. Yuav ua li cas?
SELECT NULL <> 1 OR NULL <> 2;
-- NULL
Thiab los ntawm qhov pom ntawm kev ua haujlwm tawm cov xwm txheej NULL
sib npaug FALSE
, raws li tau hais los saum toj no.
kev txiav txim siab: siv tus neeg teb xov tooj IS DISTINCT FROM
ROW
- tus neeg teb xov tooj, sib piv tag nrho cov ntaub ntawv ib zaug:
SELECT (NULL, NULL) IS DISTINCT FROM (1, 2);
-- TRUE
Qhov teeb meem 2: sib txawv ntawm kev siv tib yam kev ua haujlwm
Sib piv:
NEW."ΠΠΎΠΊΡΠΌΠ΅Π½Ρ_" = (select '"ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ"'::regclass::oid)
NEW."ΠΠΎΠΊΡΠΌΠ΅Π½Ρ_" = (select to_regclass('"ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅"')::oid)
Vim li cas thiaj muaj kev nqis peev ntxiv SELECT
? Ib txoj haujlwm to_regclass
? Vim li cas thiaj txawv...
Cia peb kho:
NEW."ΠΠΎΠΊΡΠΌΠ΅Π½Ρ_" = '"ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ"'::regclass::oid
NEW."ΠΠΎΠΊΡΠΌΠ΅Π½Ρ_" = '"ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅"'::regclass::oid
Teeb meem #3: bool precedent
Wb format qhov chaw:
{... IS NULL} OR
{... ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ} OR
{... ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅} AND
( {... Π½Π΅ΡΠ°Π²Π΅Π½ΡΡΠ²Π°} )
Oops ... Qhov tseeb, nws muab tawm tias nyob rau hauv rooj plaub ntawm qhov tseeb ntawm ib qho ntawm thawj ob qho xwm txheej, tag nrho cov xwm txheej hloov mus rau hauv TRUE
, tsis quav ntsej txog kev tsis sib xws. Thiab qhov no tsis yog txhua yam peb xav tau.
Cia peb kho:
(
{... IS NULL} OR
{... ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ} OR
{... ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅}
) AND
( {... Π½Π΅ΡΠ°Π²Π΅Π½ΡΡΠ²Π°} )
Teeb meem #4 (me): complex OR condition for one field
Qhov tseeb, peb muaj teeb meem nyob rau hauv No.3 precisely vim hais tias muaj peb tej yam kev mob. Tab sis es tsis txhob ntawm lawv, koj yuav tau txais los ntawm ib tug, siv lub mechanism coalesce ... IN
:
coalesce(NEW."ΠΠΎΠΊΡΠΌΠ΅Π½Ρ_"::text, '') IN ('', '"ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ"', '"ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅"')
Yog li peb NULL
"catch", thiab complex OR
Koj tsis tas yuav fuss nrog cov kab lus.
Tag nrho
Cia peb kho qhov peb tau txais:
IF (
coalesce(NEW."ΠΠΎΠΊΡΠΌΠ΅Π½Ρ_"::text, '') IN ('', '"ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ"', '"ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅"') AND
(
OLD."ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠ°ΡΠ°ΠΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ"
, OLD."Π£Π΄Π°Π»Π΅Π½"
, OLD."ΠΠ°ΡΠ°"
, OLD."ΠΡΠ΅ΠΌΡ"
, OLD."ΠΠΈΡΠΎΠ‘ΠΎΠ·Π΄Π°Π»"
) IS DISTINCT FROM (
NEW."ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠ°ΡΠ°ΠΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ"
, NEW."Π£Π΄Π°Π»Π΅Π½"
, NEW."ΠΠ°ΡΠ°"
, NEW."ΠΡΠ΅ΠΌΡ"
, NEW."ΠΠΈΡΠΎΠ‘ΠΎΠ·Π΄Π°Π»"
)
) THEN ...
Thiab muab hais tias qhov kev ua haujlwm no tsuas yog siv tau rau hauv UPDATE
tshwm sim vim muaj OLD/NEW
nyob rau hauv lub Upper-theem mob, ces tus mob no feem ntau yuav muab tshem tawm nyob rau hauv WHEN
-cov xwm txheej raws li qhia hauv #1...
Tau qhov twg los: www.hab.com