PostgreSQL เด†เดจเตเดฑเดฟเดชเดพเดฑเตเดฑเต‡เดฃเตเด•เตพ: SQL-เดฒเต† เด…เดตเดธเตเดฅเด•เตพ เดตเดฟเดฒเดฏเดฟเดฐเตเดคเตเดคเตเดจเตเดจเต

SQL C++ เด…เดฒเตเดฒ, JavaScript เด…เดฒเตเดฒ. เด…เดคเดฟเดจเดพเตฝ, เดฒเต‹เดœเดฟเด•เตเด•เตฝ เดŽเด•เตเดธเตเดชเตเดฐเดทเดจเตเด•เดณเตเดŸเต† เด•เดฃเด•เตเด•เตเด•เต‚เดŸเตเดŸเตฝ เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฏเดฟ เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเต, เด‡เดคเต เด’เดฐเต‡ เด•เดพเดฐเตเดฏเดฎเดฒเตเดฒ:

WHERE fncondX() AND fncondY()

= fncondX() && fncondY()

PostgreSQL เด•เตเดตเดฑเดฟ เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดทเตป เดชเตเดฒเดพเตป เด’เดชเตเดฑเตเดฑเดฟเดฎเตˆเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจ เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเดฟเตฝ เดคเดคเตเดคเตเดฒเตเดฏ เดตเตเดฏเดตเดธเตเดฅเด•เตพ เดเด•เดชเด•เตเดทเต€เดฏเดฎเดพเดฏเดฟ "เดชเตเดจเดƒเด•เตเดฐเดฎเต€เด•เดฐเดฟเด•เตเด•เดพเตป" เด•เดดเดฟเดฏเตเด‚, เดตเตเดฏเด•เตเดคเดฟเด—เดค เดฐเต‡เด–เด•เตพเด•เตเด•เดพเดฏเดฟ เด…เดตเดฏเดฟเตฝ เดšเดฟเดฒเดคเต เด•เดฃเด•เตเด•เดพเด•เตเด•เดฐเตเดคเต, เดชเตเดฐเดฏเต‹เด—เดฟเดšเตเดš เดธเต‚เดšเดฟเด•เดฏเตเดŸเต† เดตเตเดฏเดตเดธเตเดฅเด•เดณเตเดฎเดพเดฏเดฟ เด…เดตเดฏเต† เดฌเดจเตเดงเดชเตเดชเต†เดŸเตเดคเตเดคเตเด•... เดšเตเดฐเตเด•เตเด•เดคเตเดคเดฟเตฝ, เดเดฑเตเดฑเดตเตเด‚ เดŽเดณเตเดชเตเดชเดฎเตเดณเตเดณ เดฎเดพเตผเด—เตเด—เด‚ เดจเดฟเด™เตเด™เตพ เดŽเดจเตเดจเต เดŠเดนเดฟเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฃเต เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ เดเดคเต เด•เตเดฐเดฎเดคเตเดคเดฟเดฒเดพเดฃเต เด…เดตเตผ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเต (เด…เดต เด•เดฃเด•เตเด•เดพเด•เตเด•เตเดฎเต‹ เดŽเดจเตเดจเต) เดคเตเดฒเตเดฏเดฎเดพเดฏ เดตเตเดฏเดตเดธเตเดฅเด•เตพ.

เด…เดคเดฟเดจเดพเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดชเตเดชเต‹เดดเตเด‚ เดฎเตเตปเด—เดฃเดจ เดฎเดพเดจเต‡เดœเตเดšเต†เดฏเตเดฏเดฃเดฎเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพ เด…เดคเต เดฐเต‚เดชเดชเตเดชเต†เดŸเตเดคเตเดคเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต เดˆ เด…เดตเดธเตเดฅเด•เตพ เด…เดธเดฎเดคเตเดตเดฎเดพเด•เตเด•เตเด• เดตเตเดฏเดตเดธเตเดฅเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดญเดพเดตเด™เตเด™เตพ ะธ เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเตผเดฎเดพเตผ.

PostgreSQL เด†เดจเตเดฑเดฟเดชเดพเดฑเตเดฑเต‡เดฃเตเด•เตพ: SQL-เดฒเต† เด…เดตเดธเตเดฅเด•เตพ เดตเดฟเดฒเดฏเดฟเดฐเตเดคเตเดคเตเดจเตเดจเต
เดกเดพเดฑเตเดฑเดฏเตเด‚ เด…เดตเดฐเตเดฎเดพเดฏเตเดณเตเดณ เดชเตเดฐเดตเตผเดคเตเดคเดจเดตเตเดฎเดพเดฃเต เด…เดŸเดฟเดธเตเดฅเดพเดจเด‚ เดžเด™เตเด™เดณเตเดŸเต† VLSI เดธเดฎเตเดšเตเดšเดฏเด‚เด…เดคเดฟเดจเดพเตฝ, เด…เดตเดฏเดฟเดฒเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ เดถเดฐเดฟเดฏเดพเดฏเดฟ เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, เด•เดพเดฐเตเดฏเด•เตเดทเดฎเดฎเดพเดฏเตเด‚ เดจเดŸเดคเตเดคเต‡เดฃเตเดŸเดคเต เดžเด™เตเด™เตพเด•เตเด•เต เดตเดณเดฐเต† เดชเตเดฐเดงเดพเดจเดฎเดพเดฃเต. เดŽเด•เตโ€Œเดธเตโ€Œเดชเตเดฐเดทเดจเตเด•เตพ เด•เดฃเด•เตเด•เดพเด•เตเด•เตเดจเตเดจเดคเดฟเตฝ เดชเดฟเดถเด•เตเด•เตพ เด‰เดฃเตเดŸเดพเด•เดพเดจเดฟเดŸเดฏเตเดณเตเดณ เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เตพ เดจเต‹เด•เตเด•เดพเด‚, เด…เดตเดฏเตเดŸเต† เด•เดพเดฐเตเดฏเด•เตเดทเดฎเดค เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเดคเต เดฎเต‚เดฒเตเดฏเดตเดคเตเดคเดพเดฃเต.

#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: เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ/เด†เตปเดกเต เดšเต†เดฏเดฟเตป

SELECT ... WHERE EXISTS(... A) OR EXISTS(... B)

เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฐเดฃเตเดŸเดฟเดฒเตเด‚ เด…เดตเดธเดพเดจเดฟเด•เตเด•เดพเด‚ EXISTS "เดธเดคเตเดฏเด‚" เด†เดฏเดฟเดฐเดฟเด•เตเด•เตเด‚, เดชเด•เตเดทเต‡ เดฐเดฃเตเดŸเตเด‚ เดจเดฟเดตเตƒเดคเตเดคเดฟเดฏเดพเด•เตเด‚.

เดŽเดจเตเดจเดพเตฝ เด…เดตเดฏเดฟเดฒเตŠเดจเตเดจเต เดชเดฒเดชเตเดชเต‹เดดเตเด‚ "เดธเดคเตเดฏเด‚" เด†เดฃเต†เดจเตเดจเต เดžเด™เตเด™เตพเด•เตเด•เต เด‰เดฑเดชเตเดชเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ (เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ "เดคเต†เดฑเตเดฑเต" - เดตเต‡เดฃเตเดŸเดฟ AND-เดšเต†เดฏเดฟเตปเดธเต) - เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต‡เดคเต เด’เดฐเดฟเด•เตเด•เตฝ เด•เต‚เดŸเดฟ เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเดพเดคเดฟเดฐเดฟเด•เตเด•เดพเตป เดŽเด™เตเด™เดจเต†เดฏเต†เด™เตเด•เดฟเดฒเตเด‚ "เด…เดคเดฟเดจเตเดฑเต† เดฎเตเตปเด—เดฃเดจ เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป" เด•เดดเดฟเดฏเตเดฎเต‹?

เด‡เดคเต เดธเดพเดงเตเดฏเดฎเดพเดฃเต†เดจเตเดจเต เดฎเดพเดฑเตเดจเตเดจเต - เด…เตฝเด—เต‹เดฐเดฟเดคเด‚ เดธเดฎเต€เดชเดจเด‚ เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเตเดฑเต† เดตเดฟเดทเดฏเดคเตเดคเต‹เดŸเต เด…เดŸเตเดคเตเดคเดพเดฃเต PostgreSQL เด†เดจเตเดฑเดฟเดชเดพเดฑเตเดฑเต‡เดฃเตเด•เตพ: เด’เดฐเต เด…เดชเต‚เตผเดต เดฑเต†เด•เตเด•เต‹เตผเดกเต เด’เดฐเต เดœเต‹เดฏเดฟเดจเดฟเดจเตเดฑเต† เดฎเดงเตเดฏเดคเตเดคเดฟเตฝ เดŽเดคเตเดคเตเด‚.

CASE-เดจเต เด•เต€เดดเดฟเตฝ เดˆ เดฐเดฃเตเดŸเต เดตเตเดฏเดตเดธเตเดฅเด•เดณเตเด‚ เดจเดฎเตเด•เตเด•เต "เดคเดณเตเดณเตเด•":

SELECT ...
WHERE
  CASE
    WHEN EXISTS(... A) THEN TRUE
    WHEN EXISTS(... B) THEN TRUE
  END

เดˆ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ เดžเด™เตเด™เตพ เดจเดฟเตผเดตเดšเดฟเดšเตเดšเดฟเดŸเตเดŸเดฟเดฒเตเดฒ ELSEเดฎเต‚เดฒเตเดฏเด‚, เด…เดคเดพเดฏเดคเต, เดฐเดฃเตเดŸเต เดตเตเดฏเดตเดธเตเดฅเด•เดณเตเด‚ เดคเต†เดฑเตเดฑเดพเดฃเต†เด™เตเด•เดฟเตฝ CASE เดคเดฟเดฐเดฟเดšเตเดšเต เดตเดฐเตเด‚ NULL, เดŽเดจเตเดจเต เดตเตเดฏเดพเด–เตเดฏเดพเดจเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเต FALSE ะฒ WHERE- เดตเตเดฏเดตเดธเตเดฅเด•เตพ.

เดˆ เด‰เดฆเดพเดนเดฐเดฃเด‚ เดฎเดฑเตเดฑเต เดตเดดเดฟเด•เดณเดฟเตฝ เดธเด‚เดฏเต‹เดœเดฟเดชเตเดชเดฟเด•เตเด•เดพเด‚ - เดฐเตเดšเดฟเดฏเตเด‚ เดจเดฟเดฑเดตเตเด‚ เด…เดจเตเดธเดฐเดฟเดšเตเดšเต:

SELECT ...
WHERE
  CASE
    WHEN NOT EXISTS(... A) THEN EXISTS(... B)
    ELSE TRUE
  END

#3: เดŽเด™เตเด™เดจเต† [เด…เดฒเตเดฒ] เดตเตเดฏเดตเดธเตเดฅเด•เตพ เดŽเดดเตเดคเดพเด‚

เดˆ เดŸเตเดฐเดฟเด—เดฑเดฟเดจเตเดฑเต† "เดตเดฟเดšเดฟเดคเตเดฐเดฎเดพเดฏ" เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดจเตเดฑเต† เด•เดพเดฐเดฃเด™เตเด™เตพ เดตเดฟเดถเด•เดฒเดจเด‚ เดšเต†เดฏเตเดฏเดพเตป เดžเด™เตเด™เตพ เดฐเดฃเตเดŸเต เดฆเดฟเดตเดธเด‚ เดšเต†เดฒเดตเดดเดฟเดšเตเดšเต - เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเต†เดจเตเดจเต เดจเดฎเตเด•เตเด•เต เดจเต‹เด•เตเด•เดพเด‚.

เด‰เดฑเดตเดฟเดŸเด‚:

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: เดฌเต‚เตพ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเตเดŸเต† เดฎเตเตปเด—เดฃเดจ

เดจเดฎเตเด•เตเด•เต เด‰เดฑเดตเดฟเดŸเด‚ เดซเต‹เตผเดฎเดพเดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเด‚:

{... IS NULL} OR
{... ะšะพะผะฟะปะตะบั‚} OR
{... ะ”ะพะบัƒะผะตะฝั‚ะŸะพะ—ะฐั€ะฟะปะฐั‚ะต} AND
( {... ะฝะตั€ะฐะฒะตะฝัั‚ะฒะฐ} )

เดถเตเดถเต‹... เดตเดพเดธเตเดคเดตเดคเตเดคเดฟเตฝ, เด†เดฆเตเดฏเดคเตเดคเต† เดฐเดฃเตเดŸเต เดตเตเดฏเดตเดธเตเดฅเด•เดณเดฟเตฝ เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดถเดฐเดฟเดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดฎเตเดดเตเดตเตป เด…เดตเดธเตเดฅเดฏเตเด‚ เดฎเดพเดฑเตเด‚ TRUE, เด…เดธเดฎเดคเตเดตเด™เตเด™เตพ เด•เดฃเด•เตเด•เดฟเดฒเต†เดŸเตเด•เตเด•เดพเดคเต†. เดชเดฟเดจเตเดจเต† เด‡เดคเตŠเดจเตเดจเตเด‚ เดžเด™เตเด™เตพ เด†เด—เตเดฐเดนเดฟเดšเตเดšเดคเดฒเตเดฒ.

เดจเดฎเตเด•เตเด•เต เด…เดคเต เดถเดฐเดฟเดฏเดพเด•เตเด•เดพเด‚:

(
  {... IS NULL} OR
  {... ะšะพะผะฟะปะตะบั‚} OR
  {... ะ”ะพะบัƒะผะตะฝั‚ะŸะพะ—ะฐั€ะฟะปะฐั‚ะต}
) AND
( {... ะฝะตั€ะฐะฒะตะฝัั‚ะฒะฐ} )

เดชเตเดฐเดถเตเดจเด‚ #4 (เดšเต†เดฑเตเดคเต): เด’เดฐเต เดซเต€เตฝเดกเดฟเดจเตเดณเตเดณ เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเดฏ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด…เดตเดธเตเดฅ

เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ, เดฎเต‚เดจเตเดจเต เดตเตเดฏเดตเดธเตเดฅเด•เตพ เด‰เดณเตเดณเดคเดฟเดจเดพเตฝ เด•เตƒเดคเตเดฏเดฎเดพเดฏเดฟ เดจเดฎเตเดชเตผ 3 เตฝ เดžเด™เตเด™เตพเด•เตเด•เต เดชเตเดฐเดถเตโ€Œเดจเด™เตเด™เดณเตเดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเต. เดŽเดจเตเดจเดพเตฝ เด…เดตเดฏเตโ€Œเด•เตเด•เต เดชเด•เดฐเด‚ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฎเต†เด•เตเด•เดพเดจเดฟเดธเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต†เดฃเตเดฃเด‚ เดจเต‡เดŸเดพเดจเดพเด•เตเด‚ 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 ...

เดˆ เดŸเตเดฐเดฟเด—เตผ เดซเด‚เด—เตโ€Œเดทเตป เดฎเดพเดคเตเดฐเดฎเต‡ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดจเดพเด•เต‚ เดŽเดจเตเดจเต เดจเดฟเด™เตเด™เตพ เด•เดฐเตเดคเตเดจเตเดจเตเดตเต†เด™เตเด•เดฟเตฝ UPDATE- เดฒเดญเตเดฏเดค เด•เดพเดฐเดฃเด‚ เดŸเตเดฐเดฟเด—เตผ OLD/NEW เด‰เดฏเตผเดจเตเดจ เดคเดฒเดคเตเดคเดฟเดฒเตเดณเตเดณ เด…เดตเดธเตเดฅเดฏเดฟเตฝ, เดˆ เด…เดตเดธเตเดฅ เดชเตŠเดคเตเดตเต† เดธเตเดฅเดพเดชเดฟเด•เตเด•เดพเดตเตเดจเตเดจเดคเดพเดฃเต WHEN#1-เตฝ เด•เดพเดฃเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเตเดชเต‹เดฒเต† -condition...

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•