SQL non est C++, nec est JavaScript. Aestimatio igitur locutionum logicalium est diversa, et hoc omnino non est idem;
WHERE fncondX() AND fncondY()
= fncondX() && fncondY()
Dum optimizing consilium exsecutionis interrogationis PostgreSQL
Si igitur prioritatem administrare adhuc vis, constitutione debes hae conditiones inaequales cum conditionali
Data et operans cum illis est basis
#0: RTFM
Satus
Ordo aestimationee cum magni momenti est, figi potest cum constructione
CASE
. Exempli gratia, hic modus in sententia nulla divisionem vitareWHERE
vacillent;SELECT ... WHERE x > 0 AND y/x > 1.5;
Salvus optio:
SELECT ... WHERE CASE WHEN x > 0 THEN y/x > 1.5 ELSE false END;
Constructione usus est
CASE
verbum ab optimizatione tuetur, ita uti debet, cum opus sit.
# I: felis conditione
BEGIN
IF cond(NEW.fld) AND EXISTS(SELECT ...) THEN
...
END IF;
RETURN NEW;
END;
Omnia bona videntur, sed ... Nemo investituram promittit SELECT
non erit faciendum, si prima conditio falsa est. Reficere cum nested IF
:
BEGIN
IF cond(NEW.fld) THEN
IF EXISTS(SELECT ...) THEN
...
END IF;
END IF;
RETURN NEW;
END;
Nunc diligenter inspiciamus - totum corpus functionis felis evenit ut "involvatur" in IF
. Et hoc significat nihil prohibet hanc condicionem ab usu procedendi removere WHEN
-conditions
BEGIN
IF EXISTS(SELECT ...) THEN
...
END IF;
RETURN NEW;
END;
...
CREATE TRIGGER ...
WHEN cond(NEW.fld);
Aditus permittit ut servo cautione facultates serves, si falsa conditio est.
#2: VEL/ET catena
SELECT ... WHERE EXISTS(... A) OR EXISTS(... B)
Alioquin obtineri potest quod utrumque EXISTS
verum erit, sed et voluntas supplicium.
Sed si pro certo scimus unam earum esse "verum" multo saepius (vel "falsum" - for AND
- catenae) β possibile est aliquo modo "priorem suum augere", ut alter iterum denuo non fungatur?
Evenit ut possibile est - accedere algorithmice prope thema articuli
Iustus 'trudere sub CAUSA' utrumque horum condicionum est:
SELECT ...
WHERE
CASE
WHEN EXISTS(... A) THEN TRUE
WHEN EXISTS(... B) THEN TRUE
END
In hoc casu non definivimus ELSE
-value, id est, si utraque res falsa est CASE
reddet NULL
quod interpretatur FALSE
Π² WHERE
β Conditiones.
Hoc exemplum alio modo componi potest cum gustu et colore;
SELECT ...
WHERE
CASE
WHEN NOT EXISTS(... A) THEN EXISTS(... B)
ELSE TRUE
END
#3: quomodo [non] conditiones scribere
Duos dies consumpsimus in examinandis rationibus "alieni" excitato huius felis - videamus quare.
Source:
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 ...
Quaestio # I: Inaequalitas non ideo pro NULL
Demus omnia OLD
-fields referre NULL
. Quæ in ea ventura?
SELECT NULL <> 1 OR NULL <> 2;
-- NULL
Et ex parte operandi conditiones NULL
equivalent FALSE
de quibus supra.
arbitrium: Usus operator IS DISTINCT FROM
ROW
-operator, integras tabulas statim comparans;
SELECT (NULL, NULL) IS DISTINCT FROM (1, 2);
-- TRUE
Quaestio numeri II: Exsecutio alia eiusdem functionality
Lets comparare:
NEW."ΠΠΎΠΊΡΠΌΠ΅Π½Ρ_" = (select '"ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ"'::regclass::oid)
NEW."ΠΠΎΠΊΡΠΌΠ΅Π½Ρ_" = (select to_regclass('"ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅"')::oid)
Cur non extra investments SELECT
? Munus to_regclass
? Quid est aliud.
Sit fix:
NEW."ΠΠΎΠΊΡΠΌΠ΅Π½Ρ_" = '"ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ"'::regclass::oid
NEW."ΠΠΎΠΊΡΠΌΠ΅Π½Ρ_" = '"ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅"'::regclass::oid
Quaestio III: bool praecedentia
Forma lets principium:
{... IS NULL} OR
{... ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ} OR
{... ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅} AND
( {... Π½Π΅ΡΠ°Π²Π΅Π½ΡΡΠ²Π°} )
Oops... Quae quidem evenit ut in quibuslibet primis duabus conditionibus veritas, tota conditio convertitur. TRUE
inaequalitatibus neglectis. Nec hoc omnino quod voluimus.
Sit fix:
(
{... IS NULL} OR
{... ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ} OR
{... ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅}
) AND
( {... Π½Π΅ΡΠ°Π²Π΅Π½ΡΡΠ²Π°} )
Problema #4 (small): complexus OR conditio unius agri
Profecto quaestiones habuimus in n. 3 ob id quod tres conditiones erant. Sed pro illis una acquirere potes, machinatione adhibita coalesce ... IN
:
coalesce(NEW."ΠΠΎΠΊΡΠΌΠ΅Π½Ρ_"::text, '') IN ('', '"ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ"', '"ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅"')
Ita sumus NULL
"capere" et complex OR
Non habes cum parenthesi.
in summa
Sit scriptor fix quod nos obtinuit:
IF (
coalesce(NEW."ΠΠΎΠΊΡΠΌΠ΅Π½Ρ_"::text, '') IN ('', '"ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ"', '"ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠΎΠΠ°ΡΠΏΠ»Π°ΡΠ΅"') AND
(
OLD."ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠ°ΡΠ°ΠΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ"
, OLD."Π£Π΄Π°Π»Π΅Π½"
, OLD."ΠΠ°ΡΠ°"
, OLD."ΠΡΠ΅ΠΌΡ"
, OLD."ΠΠΈΡΠΎΠ‘ΠΎΠ·Π΄Π°Π»"
) IS DISTINCT FROM (
NEW."ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΠ°ΡΠ°ΠΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ"
, NEW."Π£Π΄Π°Π»Π΅Π½"
, NEW."ΠΠ°ΡΠ°"
, NEW."ΠΡΠ΅ΠΌΡ"
, NEW."ΠΠΈΡΠΎΠ‘ΠΎΠ·Π΄Π°Π»"
)
) THEN ...
Et cum haec felis functione tantum uti possit UPDATE
ligulae ex praesentia OLD/NEW
in superiori gradu condicionem , tum haec fere accipi potest WHEN
-condition ut ostensum est in # I...
Source: www.habr.com