SQL dia tsy C++, ary tsy JavaScript. Noho izany, ny kajy ny teny lojika dia mitranga amin'ny fomba hafa, ary tsy mitovy izany:
WHERE fncondX() AND fncondY()
= fncondX() && fncondY()
Ao anatin'ny dingan'ny fanatsarana ny drafitry ny fanatanterahana ny fangatahana PostgreSQL
Noho izany, raha mbola te-hitantana ny laharam-pahamehana ianao dia mila manamboatra azy io ataovy tsy mitovy ireo fepetra ireo mampiasa fepetra
Ny angon-drakitra sy ny fiaraha-miasa amin'izy ireo no fototra
#0: RTFM
manomboka
Rehefa zava-dehibe ny filaharan'ny fanombanana dia azo alaina amin'ny alalan'ny fananganana
CASE
. Ohatra, fomba iray hialana amin'ny fizarana aotra amin'ny fehezanteny iray izanyWHERE
tsy azo ianteherana:SELECT ... WHERE x > 0 AND y/x > 1.5;
Safidy azo antoka:
SELECT ... WHERE CASE WHEN x > 0 THEN y/x > 1.5 ELSE false END;
Ny endrika ampiasaina amin'izany fomba izany
CASE
miaro ny fitenenana amin'ny fanatsarana, noho izany dia tokony hampiasaina rehefa ilaina izany.
#1: fepetran'ny trigger
BEGIN
IF cond(NEW.fld) AND EXISTS(SELECT ...) THEN
...
END IF;
RETURN NEW;
END;
Toa tsara ny zava-drehetra, saingy ... Tsy misy mampanantena fa ny fampiasam-bola SELECT
tsy ho vonoina raha diso ny fepetra voalohany. Aleo amboary amin'ny nested IF
:
BEGIN
IF cond(NEW.fld) THEN
IF EXISTS(SELECT ...) THEN
...
END IF;
END IF;
RETURN NEW;
END;
Andeha hojerentsika tsara - ny vatana manontolo amin'ny fiasan'ny trigger dia "voafono". IF
. Midika izany fa tsy misy manakana antsika tsy hanala io fepetra io amin'ny fomba fampiasana WHEN
- fepetra
BEGIN
IF EXISTS(SELECT ...) THEN
...
END IF;
RETURN NEW;
END;
...
CREATE TRIGGER ...
WHEN cond(NEW.fld);
Ity fomba fiasa ity dia azo antoka fa hamonjy ny loharanon'ny mpizara rehefa diso ny fepetra.
#2: OR/AND rojo
SELECT ... WHERE EXISTS(... A) OR EXISTS(... B)
Raha tsy izany dia mety hiafara amin'ny roa ianao EXISTS
dia ho "marina", fa samy ho tanteraka.
Saingy raha fantatsika tsara fa ny iray amin'izy ireo dia "marina" matetika kokoa (na "diso" - satria AND
-chains) - azo atao ve ny "hampitombo ny laharam-pahamehana" mba tsy hovonoina indray ny faharoa?
Hita fa azo atao izany - ny fomba algorithmika dia akaiky ny lohahevitry ny lahatsoratra
Andeha hojerentsika fotsiny ireo fepetra roa ireo amin'ny CASE:
SELECT ...
WHERE
CASE
WHEN EXISTS(... A) THEN TRUE
WHEN EXISTS(... B) THEN TRUE
END
Amin'ity tranga ity dia tsy nofaritanay ELSE
-value, izany hoe raha diso ny fepetra roa CASE
hiverina NULL
, izay adika hoe FALSE
Π² WHERE
- fepetra.
Ity ohatra ity dia azo atambatra amin'ny fomba hafa - miankina amin'ny tsiro sy ny loko:
SELECT ...
WHERE
CASE
WHEN NOT EXISTS(... A) THEN EXISTS(... B)
ELSE TRUE
END
#3: ahoana [tsy] fanoratana fepetra
Nandany roa andro izahay namakafaka ny anton'ny hetsika "hafahafa" an'ity trigger ity - andeha hojerentsika ny antony.
Loharano:
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 ...
Olana #1: tsy manaja ny NULL ny tsy fitoviana
Alao sary an-tsaina fa ny zava-drehetra OLD
- nisy dikany ny saha NULL
. Inona no hitranga?
SELECT NULL <> 1 OR NULL <> 2;
-- NULL
Ary avy amin'ny fomba fijery ny miasa ny fepetra NULL
mitovy FALSE
, araka ny voalaza etsy ambony.
fanapahan-kevitra: mampiasa opΓ©rateur IS DISTINCT FROM
ROW
-operator, mampitaha ny rakitsoratra manontolo indray mandeha:
SELECT (NULL, NULL) IS DISTINCT FROM (1, 2);
-- TRUE
Olana #2: fampiharana samihafa amin'ny fiasa mitovy
Andeha hampitaha:
NEW."ΠΠΎΠΊΡΠΌΠ΅Π½Ρ_" = (select '"ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ"'::regclass::oid)
NEW."ΠΠΎΠΊΡΠΌΠ΅Π½Ρ_" = (select to_regclass('"ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅"')::oid)
Nahoana no misy fampiasam-bola fanampiny eto? SELECT
? Asa iray to_regclass
? Nahoana no tsy mitovy?..
Andeha amboary izany:
NEW."ΠΠΎΠΊΡΠΌΠ΅Π½Ρ_" = '"ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ"'::regclass::oid
NEW."ΠΠΎΠΊΡΠΌΠ΅Π½Ρ_" = '"ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅"'::regclass::oid
Olana #3: laharam-pahamehana amin'ny asa bool
Andao amboary ny loharano:
{... IS NULL} OR
{... ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ} OR
{... ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅} AND
( {... Π½Π΅ΡΠ°Π²Π΅Π½ΡΡΠ²Π°} )
Oops... Raha ny marina, hita fa raha marina ny iray amin'ireo fepetra roa voalohany dia mivadika ho ny fepetra iray manontolo TRUE
, tsy misy fiheverana ny tsy fitoviana. Ary tsy izany mihitsy no tadiavinay.
Andeha amboary izany:
(
{... IS NULL} OR
{... ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ} OR
{... ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅}
) AND
( {... Π½Π΅ΡΠ°Π²Π΅Π½ΡΡΠ²Π°} )
Olana #4 (kely): sarotra OR fepetra ho an'ny saha iray
Raha ny marina, nanana olana izahay tamin'ny laharana faha-3 satria nisy fepetra telo. Fa raha tokony ho azy ireo dia azonao atao ny miala amin'ny iray, amin'ny fampiasana ny mekanika coalesce ... IN
:
coalesce(NEW."ΠΠΎΠΊΡΠΌΠ΅Π½Ρ_"::text, '') IN ('', '"ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ"', '"ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅"')
Ka isika NULL
"hisambotra izahay", ary sarotra OR
Tsy ilaina ny mitabataba amin'ny fononteny.
ΠΡΠΎΠ³ΠΎ
Andeha horaketina izay azonay:
IF (
coalesce(NEW."ΠΠΎΠΊΡΠΌΠ΅Π½Ρ_"::text, '') IN ('', '"ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ"', '"ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅"') AND
(
OLD."ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠ°ΡΠ°ΠΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ"
, OLD."Π£Π΄Π°Π»Π΅Π½"
, OLD."ΠΠ°ΡΠ°"
, OLD."ΠΡΠ΅ΠΌΡ"
, OLD."ΠΠΈΡΠΎΠ‘ΠΎΠ·Π΄Π°Π»"
) IS DISTINCT FROM (
NEW."ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠ°ΡΠ°ΠΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ"
, NEW."Π£Π΄Π°Π»Π΅Π½"
, NEW."ΠΠ°ΡΠ°"
, NEW."ΠΡΠ΅ΠΌΡ"
, NEW."ΠΠΈΡΠΎΠ‘ΠΎΠ·Π΄Π°Π»"
)
) THEN ...
Ary raha heverinao fa io fiasa trigger io dia tsy azo ampiasaina afa-tsy ao UPDATE
- trigger noho ny fisiany OLD/NEW
amin'ny toe-javatra ambony, dia azo apetraka amin'ny ankapobeny io fepetra io WHEN
-condition, araka ny hita ao amin'ny #1...
Source: www.habr.com