SQL si C++, komanso JavaScript. Chifukwa chake, kuwunika kwa mawu omveka ndi kosiyana, ndipo izi sizofanana konse:
WHERE fncondX() AND fncondY()
= fncondX() && fncondY()
Pomwe mukukhathamiritsa dongosolo lamachitidwe a PostgreSQL funso
Chifukwa chake, ngati mukufunabe kuyang'anira zoyambira, muyenera kumangoganiza kupanga zinthu izi kukhala zosafanana ndi zovomerezeka
Deta ndikugwira nawo ntchito ndiye maziko
#0: RTFM
Kuyambira
Pamene dongosolo la kuwunika ndilofunika, likhoza kukhazikitsidwa ndi kumanga
CASE
. Mwachitsanzo, njira iyi kupewa kugawikana ndi ziro mu chiganizoWHERE
osadalirika:SELECT ... WHERE x > 0 AND y/x > 1.5;
Njira yotetezeka:
SELECT ... WHERE CASE WHEN x > 0 THEN y/x > 1.5 ELSE false END;
Ntchito yomanga
CASE
imateteza mawuwo kuti asakwaniritsidwe, choncho amayenera kugwiritsidwa ntchito pokhapokha pakufunika.
#1: chikhalidwe choyambitsa
BEGIN
IF cond(NEW.fld) AND EXISTS(SELECT ...) THEN
...
END IF;
RETURN NEW;
END;
Chilichonse chikuwoneka bwino, koma ... Palibe amene amalonjeza kuti ndalamazo SELECT
sichidzaphedwa ngati chikhalidwe choyamba chiri chabodza. Konzani ndi nested IF
:
BEGIN
IF cond(NEW.fld) THEN
IF EXISTS(SELECT ...) THEN
...
END IF;
END IF;
RETURN NEW;
END;
Tsopano tiyeni tiyang'ane mosamala - thupi lonse la choyambitsa ntchito linasanduka "lokulungidwa" mkati IF
. Ndipo izi zikutanthauza kuti palibe chomwe chingatilepheretse kuchotsa vutoli kuchokera mu ndondomeko yogwiritsira ntchito WHEN
-mikhalidwe
BEGIN
IF EXISTS(SELECT ...) THEN
...
END IF;
RETURN NEW;
END;
...
CREATE TRIGGER ...
WHEN cond(NEW.fld);
Njirayi imakulolani kuti musunge zida za seva ndi chitsimikizo ngati mkhalidwewo ndi wabodza.
#2: KAPENA/NDI unyolo
SELECT ... WHERE EXISTS(... A) OR EXISTS(... B)
Apo ayi, zikhoza kupezedwa kuti onse EXISTS
zidzakhala zoona, koma onse awiri adzaphedwa.
Koma ngati tikudziwa motsimikiza kuti mmodzi wa iwo ndi "woona" nthawi zambiri (kapena "zabodza" - chifukwa AND
-maketani) - ndizotheka mwanjira ina "kuwonjezera kufunikira kwake" kuti yachiwiriyo isaphedwenso?
Zikutheka kuti ndizotheka - njira ya algorithmically ili pafupi ndi mutu wa nkhaniyi
Tiyeni "tikankhire pansi pa CASE" zonsezi:
SELECT ...
WHERE
CASE
WHEN EXISTS(... A) THEN TRUE
WHEN EXISTS(... B) THEN TRUE
END
Pankhaniyi, sitinafotokoze ELSE
-mtengo, ndiko kuti, ngati zonse zili zabodza CASE
adzabwerera NULL
, lomwe limamasuliridwa kuti FALSE
Π² WHERE
- zikhalidwe.
Chitsanzochi chikhoza kuphatikizidwa mwanjira ina - kulawa ndi mtundu:
SELECT ...
WHERE
CASE
WHEN NOT EXISTS(... A) THEN EXISTS(... B)
ELSE TRUE
END
#3: momwe [osalemba] zikhalidwe
Tidakhala masiku awiri ndikusanthula zifukwa "zachilendo" zoyambitsa izi - tiyeni tiwone chifukwa chake.
Gwero:
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 ...
Vuto #1: Kusafanana sikuwerengera NULL
Tiyerekeze kuti zonse OLD
-minda zofunika NULL
. Kodi chidzachitike n'chiyani?
SELECT NULL <> 1 OR NULL <> 2;
-- NULL
Ndipo kuchokera kumalingaliro akuchita zinthu NULL
ofanana FALSE
, monga tafotokozera pamwambapa.
chisankho: ogwiritsa ntchito IS DISTINCT FROM
ROW
-othandizira, kufananiza zolemba zonse nthawi imodzi:
SELECT (NULL, NULL) IS DISTINCT FROM (1, 2);
-- TRUE
Vuto nambala 2: kukhazikitsa kosiyana kwa magwiridwe antchito omwewo
Yerekezerani:
NEW."ΠΠΎΠΊΡΠΌΠ΅Π½Ρ_" = (select '"ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ"'::regclass::oid)
NEW."ΠΠΎΠΊΡΠΌΠ΅Π½Ρ_" = (select to_regclass('"ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅"')::oid)
Chifukwa chiyani pali ndalama zowonjezera SELECT
? Ntchito to_regclass
? Chifukwa chiyani zili zosiyana...
Tiyeni tikonze:
NEW."ΠΠΎΠΊΡΠΌΠ΅Π½Ρ_" = '"ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ"'::regclass::oid
NEW."ΠΠΎΠΊΡΠΌΠ΅Π½Ρ_" = '"ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅"'::regclass::oid
Vuto #3: kutsogola kwa bool
Tiyeni tipange gwero:
{... IS NULL} OR
{... ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ} OR
{... ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅} AND
( {... Π½Π΅ΡΠ°Π²Π΅Π½ΡΡΠ²Π°} )
Oops ... M'malo mwake, zidapezeka kuti ngati chowonadi chilichonse mwamikhalidwe iwiri yoyambirira, mkhalidwe wonsewo umasanduka. TRUE
, kunyalanyaza kusagwirizana. Ndipo izi sizomwe tinkafuna.
Tiyeni tikonze:
(
{... IS NULL} OR
{... ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ} OR
{... ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅}
) AND
( {... Π½Π΅ΡΠ°Π²Π΅Π½ΡΡΠ²Π°} )
Vuto #4 (laling'ono): zovuta OR chikhalidwe cha gawo limodzi
Kwenikweni, tinali ndi mavuto mu No. 3 ndendende chifukwa panali zikhalidwe zitatu. Koma m'malo mwa iwo, mutha kudutsa ndi imodzi, pogwiritsa ntchito makinawo coalesce ... IN
:
coalesce(NEW."ΠΠΎΠΊΡΠΌΠ΅Π½Ρ_"::text, '') IN ('', '"ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ"', '"ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅"')
Momwemonso ife NULL
"kugwira", ndi zovuta OR
Simuyenera kukangana ndi mabatani.
Chiwerengero
Tiyeni tikonze zomwe tili nazo:
IF (
coalesce(NEW."ΠΠΎΠΊΡΠΌΠ΅Π½Ρ_"::text, '') IN ('', '"ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ"', '"ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅"') AND
(
OLD."ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠ°ΡΠ°ΠΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ"
, OLD."Π£Π΄Π°Π»Π΅Π½"
, OLD."ΠΠ°ΡΠ°"
, OLD."ΠΡΠ΅ΠΌΡ"
, OLD."ΠΠΈΡΠΎΠ‘ΠΎΠ·Π΄Π°Π»"
) IS DISTINCT FROM (
NEW."ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠ°ΡΠ°ΠΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ"
, NEW."Π£Π΄Π°Π»Π΅Π½"
, NEW."ΠΠ°ΡΠ°"
, NEW."ΠΡΠ΅ΠΌΡ"
, NEW."ΠΠΈΡΠΎΠ‘ΠΎΠ·Π΄Π°Π»"
)
) THEN ...
Ndipo popeza kuti choyambitsa ichi chitha kugwiritsidwa ntchito mkati UPDATE
kulira chifukwa cha kukhalapo OLD/NEW
mu chikhalidwe chapamwamba, ndiye kuti vutoli likhoza kuchitidwa WHEN
-condition monga zikuwonetsedwa mu # 1 ...
Source: www.habr.com