PostgreSQL AntipatternsαŸ– αž€αžΆαžšαžœαžΆαž™αžαž˜αŸ’αž›αŸƒαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸ…αž€αŸ’αž“αž»αž„ SQL

SQL αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆ C ++ αž αžΎαž™αž€αŸαž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆ JavaScript αžŠαŸ‚αžšαŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž€αžΆαžšαžœαžΆαž™αžαž˜αŸ’αž›αŸƒαž“αŸƒαž€αžΆαžšαž”αž‰αŸ’αž…αŸαž‰αž˜αžαž·αž‘αžΌαž‡αžΈαžαž›αž‚αžΊαžαž»αžŸαž‚αŸ’αž“αžΆ αž αžΎαž™αž“αŸαŸ‡αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαžšαžΏαž„αžŠαžΌαž…αž‚αŸ’αž“αžΆαž‘αžΆαž›αŸ‹αžαŸ‚αžŸαŸ„αŸ‡αŸ–

WHERE fncondX() AND fncondY()

= fncondX() && fncondY()

αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž•αŸ‚αž“αž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž“αŸƒαžŸαŸ†αžŽαž½αžš PostgreSQL αž’αžΆαž… "αžšαŸ€αž”αž…αŸ†αž‘αžΎαž„αžœαž·αž‰" αžαžΆαž˜αž’αŸ†αž–αžΎαž…αž·αžαŸ’αžαž“αžΌαžœαž›αž€αŸ’αžαžαžŽαŸ’αžŒαžŸαž˜αž˜αžΌαž›, αž€αž»αŸ†αž‚αžŽαž“αžΆαžŽαžΆαž˜αž½αž™αž“αŸƒαž–αž½αž€αžœαžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαž”αž»αž‚αŸ’αž‚αž›, αž™αŸ„αž„αž‘αŸ…αž›αž€αŸ’αžαžαžŽαŸ’αžŒαž“αŸƒαž›αž·αž”αž·αž€αŸ’αžšαž˜αžŠαŸ‚αž›αž”αžΆαž“αž’αž“αž»αžœαžαŸ’αž ... αž“αž·αž™αžΆαž™αž±αŸ’αž™αžαŸ’αž›αžΈ αžœαž·αž’αžΈαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž”αŸ†αž•αž»αžαž‚αžΊαžŸαž“αŸ’αž˜αžαŸ‹αžαžΆαž’αŸ’αž“αž€ αž˜αž·αž“αž’αžΆαž…αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž”αžΆαž“αž‘αŸαŸ” αž›αŸ†αžŠαžΆαž”αŸ‹αžŠαŸ‚αž›αž–αž½αž€αž‚αŸαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“ (αž“αž·αž„αžαžΆαžαžΎαž–αž½αž€αž‚αŸαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž‚αžŽαž“αžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹) αžŸαŸ’αž˜αžΎ αž›αž€αŸ’αžαžαžŽαŸ’αžŒαŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž αžΎαž™ αž”αžΎαž’αŸ’αž“αž€αž“αŸ…αžαŸ‚αž…αž„αŸ‹αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž’αžΆαž‘αž·αž—αžΆαž– αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžšαŸ€αž”αž…αŸ†αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αž’αŸ’αžœαžΎαž±αŸ’αž™αž›αž€αŸ’αžαžαžŽαŸ’αžŒαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž˜αž·αž“αžŸαŸ’αž˜αžΎαž‚αŸ’αž“αžΆ αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž›αž€αŸ’αžαžαžŽαŸ’αžŒ αž€αž“αŸ’αžŸαŸ„αž˜ ΠΈ αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžš.

PostgreSQL AntipatternsαŸ– αž€αžΆαžšαžœαžΆαž™αžαž˜αŸ’αž›αŸƒαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸ…αž€αŸ’αž“αž»αž„ SQL
αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž“αž·αž„αž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž–αž½αž€αž‚αŸαž‚αžΊαž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αž“αŸƒ VLSI complex αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ”αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžœαžΆαž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αžαŸ’αž›αžΆαŸ†αž„αžŽαžΆαžŸαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αž½αž€αž™αžΎαž„αžŠαŸ‚αž›αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž›αžΎαž–αž½αž€αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž˜αž·αž“αžαŸ’αžšαžΉαž˜αžαŸ‚αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ‚αž˜αž‘αžΆαŸ†αž„αž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž‘αŸ€αžαž•αž„αŸ” αžŸαžΌαž˜αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αž§αž‘αžΆαž αžšαžŽαŸαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αžŠαŸ‚αž›αž€αŸ†αž αž»αžŸαž€αŸ’αž“αž»αž„αž€αžΆαžšαžœαžΆαž™αžαž˜αŸ’αž›αŸƒαž€αžΆαžšαž”αž‰αŸ’αž…αŸαž‰αž˜αžαž·αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž‘αžΎαž„ αž“αž·αž„αž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αžœαžΆαž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαŸ”

# 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) - αžαžΎαžœαžΆαž’αžΆαž…αž‘αŸ…αžšαž½αž…αžŠαŸ„αž™αžšαž”αŸ€αž”αžŽαžΆαžŠαžΎαž˜αŸ’αž”αžΈ "αž”αž„αŸ’αž€αžΎαž“αž’αžΆαž‘αž·αž—αžΆαž–αžšαž”αžŸαŸ‹αžœαžΆ" αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžαžΆαž‘αžΈαž–αžΈαžšαž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž˜αŸ’αžαž„αž‘αŸ€αžαž‘αŸ?

αžœαžΆαž”αŸ’αžšαŸ‚αžαžΆαžœαžΆαž’αžΆαž…αž‘αŸ…αžšαž½αž… - αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž“αŸƒαž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‚αžΊαž“αŸ…αž‡αž·αžαž”αŸ’αžšαž’αžΆαž“αž”αž‘αž“αŸƒαž’αžαŸ’αžαž”αž‘ PostgreSQL AntipatternsαŸ– αž’αžΆαžαž»αžŠαŸαž€αž˜αŸ’αžšαžˆαžΆαž“αžŠαž›αŸ‹αž–αžΆαž€αŸ‹αž€αžŽαŸ’αžαžΆαž›αž“αŸƒ JOIN.

αž…αžΌαžšαž™αžΎαž„αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚ "shove under 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

# 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 (αžαžΌαž…)αŸ– αž›αž€αŸ’αžαžαžŽαŸ’αžŒαžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰ OR αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžœαžΆαž›αž˜αž½αž™αŸ”

αžαžΆαž˜αž–αž·αžαž‘αŸ… αž™αžΎαž„αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαž€αŸ’αž“αž»αž„αž›αŸαž 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-αž›αž€αŸ’αžαžαžŽαŸ’αžŒαžŠαžΌαž…αž”αž„αŸ’αž αžΆαž‰αž€αŸ’αž“αž»αž„αž›αŸαžαŸ‘...

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹