SQL ááẠC++ ááá¯ááºáá² JavaScript ááá¯ááºáá«á ááá¯á·ááŒá±á¬áá·áºá áá¯áá¹áááá±áá¡áá¯á¶ážá¡ááŸá¯ááºážáá»á¬ážááᯠááœááºáá»ááºááŒááºážááẠááœá²ááŒá¬ážá áœá¬ááŒá áºáá±á«áºááŒá®áž áááºážááẠáá¯á¶ážááá°áá®áááºááá¯ááºáá±á
WHERE fncondX() AND fncondY()
= fncondX() && fncondY()
PostgreSQL query execution plan ááᯠááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬áẠáá¯ááºáá±á¬ááºááŒááºáž áá¯ááºáááºážá
ááºááœááº
ááá¯á·ááŒá±á¬áá·áº áŠážá
á¬ážáá±áž á
á®áá¶ááá·áºááœá²ááá¯áá«á áááºážááᯠáááºáá±á¬ááºááẠááá¯á¡ááºáá«áááºá áá®á¡ááŒá±á¡áá±ááœá±ááᯠááá»áŸáá¡á±á¬ááºáá¯ááºáá«á conditionals ááᯠá¡áá¯á¶ážááŒá¯
áá±áá¬ááŸáá·áº áááºážááá¯á·ááŸáá·áº áá¯ááºáá±á¬ááºááŒááºážááẠá¡ááŒá±áá¶ááŒá
áºáááºá
#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) - áá¯ááááá
áºáá¯ááᯠáá±á¬ááºáá
áºááŒááẠáááºááá¯ááºáá±á¬ááºááá¯ááºá¡á±á¬áẠ"áááºážááŠážá
á¬ážáá±áž" ááᯠáá
áºáááºážáááºážááŒáá·áº "ááá¯áž" ááẠááŒá
áºááá¯ááºáá«ááá¬ážá
ááŒá
áºááá¯ááºáááºááŸá¬- algorithmic áá»ááºážáááºááŸá¯ááẠáá±á¬ááºážáá«ážááá±á«ááºážá
ááºááŸáá·áº áá®ážá
ááºáá«áááºá
CASE á¡á±á¬ááºááœáẠá€á¡ááŒá±á¡áá±ááŸá áºáá¯áá¯á¶ážááᯠ"ááœááºáž" ááá¯ááºááŒáá«á áá¯á·á
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
áá¶áá«áẠá- á¡ááŒá±á¡áá±áá»á¬ážááᯠáááºááá¯á·áá±ážáááºáááºážá
á€á¡á áá»áá¯ážááŸá¯á "áá°ážáááºážáá±á¬" áá¯ááºáá±á¬ááºáá»ááºá¡ááœáẠá¡ááŒá±á¬ááºážáááºážáá»á¬ážááᯠááœá²ááŒááºážá áááºááŒá¬ááŒá®áž áá»áœááºá¯ááºááá¯á· ááŸá áºáááºááŒá¬áá²á·ááẠ- á¡áááºááŒá±á¬áá·áºááá¯áááºááᯠááŒáá·áºááŒáá«á áá¯á·á
á¡áááºážá¡ááŒá áº-
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
áááºáááºáá»á¬ážááẠá¡áááá¹áá«ááºááŸááááºá 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 (á¡áá±áž): á¡ááœááºáá áºáá¯á¡ááœáẠááŸá¯ááºááœá±ážáá±á¬ ááá¯á·ááá¯áẠá¡ááŒá±á¡áá±
ááááºáá±á¬á·á áá¶áá«áẠá ááŸá¬ á¡ááŒá±á¡áá± áá¯á¶ážáá¯ááŸáááá¯á· á¡ááá¡áá» ááŒá¿áá¬ááœá± ááŸááá²á·áá«áááºá ááá¯á·áá±á¬áº áááºážááá¯á·á¡á
á¬áž ááá¹ááá¬ážááᯠá¡áá¯á¶ážááŒá¯á áá
áºáŠážááŸáá·áºáá
áºáŠáž ááŒááºáááºážááá¯ááºáááºá 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 function ááœááºáá¬á¡áá¯á¶ážááŒá¯ááá¯ááºáááºáᯠáááºáá°ááá«á UPDATE
- áááŸáááá¯ááºááŸá¯ááŒá±á¬áá·áº á¡á
áá»áá¯ážááŒááºážá OLD/NEW
á¡áááºá¡ááá·áºá¡ááŒá±á¡áá±ááœááºá ááá¯á·áá±á¬áẠá€á¡ááŒá±á¡áá±ááᯠáá±áá°áá»á¡á¬ážááŒáá·áº ááá·áºááœááºážááá¯ááºáááºá WHEN
áá¶áá«áẠá ááŸá¬ááŒáá¬ážáá²á·á¡ááá¯ááºáž á¡ááŒá±á¡áá±...
source: www.habr.com