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 เจเจ‚เจŸเฉ€เจชเฉˆเจŸเจฐเจจ: เจฆเฉเจฐเจฒเฉฑเจญ เจเจ‚เจŸเจฐเฉ€ เจ‡เฉฑเจ• JOIN เจฆเฉ‡ เจฎเฉฑเจง เจคเฉฑเจ• เจชเจนเฉเฉฐเจšเจฆเฉ€ เจนเฉˆ.

เจ†เจ‰ เจ‡เจนเจจเจพเจ‚ เจฆเฉ‹เจนเจพเจ‚ เจธเจผเจฐเจคเจพเจ‚ เจจเฉ‚เฉฐ "เจ•เฉ‡เจธ เจฆเฉ‡ เจนเฉ‡เจ เจพเจ‚ เจงเฉฑเจ•เฉ‹" เจ•เจฐเฉ€เจ:

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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹