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 เชเชจเซเชŸเชฟเชชเซ‡เชŸเชฐเซเชจ: เชฆเซเชฐเซเชฒเชญ เชเชจเซเชŸเซเชฐเซ€ เชœเซ‹เช‡เชจเชจเซ€ เชฎเชงเซเชฏเชฎเชพเช‚ เชชเชนเซ‹เช‚เชšเซ‡ เช›เซ‡.

เชšเชพเชฒเซ‹ เช† เชฌเช‚เชจเซ‡ เชถเชฐเชคเซ‹เชจเซ‡ เชซเช•เซเชค "เช•เซ‡เชธ เชนเซ‡เช เชณ เชงเช•เซเช•เซ‹ เชฎเชพเชฐเซ€เช":

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 เชฎเชพเช‚ เชฌเชคเชพเชตเซเชฏเชพ เชชเซเชฐเชฎเชพเชฃเซ‡ เชธเซเชฅเชฟเชคเชฟ...

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹