āĻĒā§‹āĻ¸ā§āĻŸāĻ—ā§āĻ°ā§‡āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻŸāĻŋāĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨āĻ¸: āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛-āĻ āĻļāĻ°ā§āĻ¤ āĻŽā§‚āĻ˛ā§āĻ¯āĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻž

SQL C++ āĻ¨āĻ¯āĻŧ, āĻāĻŦāĻ‚ āĻœāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻ¨āĻ¯āĻŧāĨ¤ āĻ…āĻ¤āĻāĻŦ, āĻ˛āĻœāĻŋāĻ•ā§āĻ¯āĻžāĻ˛ āĻāĻ•ā§āĻ¸āĻĒā§āĻ°ā§‡āĻļāĻ¨ā§‡āĻ° āĻ—āĻŖāĻ¨āĻž āĻ­āĻŋāĻ¨ā§āĻ¨āĻ­āĻžāĻŦā§‡ āĻ˜āĻŸā§‡ āĻāĻŦāĻ‚ āĻāĻŸāĻŋ āĻŽā§‹āĻŸā§‡āĻ“ āĻāĻ•āĻ‡ āĻœāĻŋāĻ¨āĻŋāĻ¸ āĻ¨āĻ¯āĻŧ:

WHERE fncondX() AND fncondY()

= fncondX() && fncondY()

PostgreSQL āĻ•ā§āĻ¯ā§‹āĻ¯āĻŧāĻžāĻ°ā§€ āĻāĻ•ā§āĻ¸āĻŋāĻ•āĻŋāĻ‰āĻļāĻ¨ āĻĒā§āĻ˛ā§āĻ¯āĻžāĻ¨ āĻ…āĻĒā§āĻŸāĻŋāĻŽāĻžāĻ‡āĻœ āĻ•āĻ°āĻžāĻ° āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ¯āĻŧ āĻ¨āĻŋāĻ°ā§āĻŦāĻŋāĻšāĻžāĻ°ā§‡ "āĻĒā§āĻ¨āĻ°ā§āĻŦāĻŋāĻ¨ā§āĻ¯āĻžāĻ¸" āĻ¸āĻŽāĻ¤ā§āĻ˛ āĻļāĻ°ā§āĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻ¸ā§āĻŦāĻ¤āĻ¨ā§āĻ¤ā§āĻ° āĻ°ā§‡āĻ•āĻ°ā§āĻĄā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¤āĻžāĻĻā§‡āĻ° āĻ•āĻŋāĻ›ā§ āĻ—āĻŖāĻ¨āĻž āĻ•āĻ°āĻŦā§‡āĻ¨ āĻ¨āĻž, āĻ¤āĻžāĻĻā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ—āĻ•ā§ƒāĻ¤ āĻ¸ā§‚āĻšāĻ•ā§‡āĻ° āĻļāĻ°ā§āĻ¤āĻ—ā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāĻ¤ āĻ•āĻ°ā§āĻ¨... āĻ¸āĻ‚āĻ•ā§āĻˇā§‡āĻĒā§‡, āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ¸āĻšāĻœ āĻ‰āĻĒāĻžāĻ¯āĻŧ āĻšāĻ˛ āĻ…āĻ¨ā§āĻŽāĻžāĻ¨ āĻ•āĻ°āĻž āĻ¯ā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻ¨āĻŋāĻ¯āĻŧāĻ¨ā§āĻ¤ā§āĻ°āĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻ¨āĻž āĻ¤āĻžāĻ°āĻž āĻ•āĻŋ āĻ•ā§āĻ°āĻŽā§‡ āĻ•āĻ°āĻŦā§‡ (āĻāĻŦāĻ‚ āĻ¤āĻžāĻ°āĻž āĻ†āĻĻā§Œ āĻ—āĻŖāĻ¨āĻž āĻ•āĻ°āĻž āĻšāĻŦā§‡ āĻ•āĻŋāĻ¨āĻž) āĻ¸āĻŽāĻžāĻ¨ āĻļāĻ°ā§āĻ¤āĻžāĻŦāĻ˛ā§€

āĻ…āĻ¤āĻāĻŦ, āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻāĻ–āĻ¨āĻ“ āĻ…āĻ—ā§āĻ°āĻžāĻ§āĻŋāĻ•āĻžāĻ° āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻ¨āĻž āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ¨ āĻ¤āĻŦā§‡ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻāĻŸāĻŋ āĻ—āĻ āĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻāĻ‡ āĻļāĻ°ā§āĻ¤ āĻ…āĻ¸āĻŽ āĻ•āĻ°āĻž āĻļāĻ°ā§āĻ¤āĻžāĻŦāĻ˛ā§€ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ…āĻ­āĻŋāĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋ и āĻ…āĻĒāĻžāĻ°ā§‡āĻŸāĻžāĻ°.

āĻĒā§‹āĻ¸ā§āĻŸāĻ—ā§āĻ°ā§‡āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻŸāĻŋāĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨āĻ¸: āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛-āĻ āĻļāĻ°ā§āĻ¤ āĻŽā§‚āĻ˛ā§āĻ¯āĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻž
āĻĄā§‡āĻŸāĻž āĻāĻŦāĻ‚ āĻ¤āĻžāĻĻā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻž āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ­āĻŋāĻāĻ˛āĻāĻ¸āĻ†āĻ‡ āĻ•āĻŽāĻĒā§āĻ˛ā§‡āĻ•ā§āĻ¸, āĻ¤āĻžāĻ‡ āĻāĻŸāĻŋ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¤ā§āĻ¯āĻ¨ā§āĻ¤ āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻ¯ā§‡ āĻ¤āĻžāĻĻā§‡āĻ° āĻ‰āĻĒāĻ° āĻ…āĻĒāĻžāĻ°ā§‡āĻļāĻ¨āĻ—ā§āĻ˛āĻŋ āĻ•ā§‡āĻŦāĻ˛ āĻ¸āĻ āĻŋāĻ•āĻ­āĻžāĻŦā§‡ āĻ¨āĻ¯āĻŧ, āĻĻāĻ•ā§āĻˇāĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§‡āĻ“ āĻ¸āĻžā§āĻšāĻžāĻ˛āĻŋāĻ¤ āĻšāĻ¯āĻŧāĨ¤ āĻ†āĻ¸ā§āĻ¨ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ—ā§āĻ˛āĻŋ āĻĻā§‡āĻ–āĻŋ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ…āĻ­āĻŋāĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋ āĻ—āĻŖāĻ¨āĻž āĻ•āĻ°āĻžāĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻ¤ā§āĻ°ā§āĻŸāĻŋāĻ—ā§āĻ˛āĻŋ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻāĻŦāĻ‚ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻāĻŸāĻŋ āĻ¤āĻžāĻĻā§‡āĻ° āĻĻāĻ•ā§āĻˇāĻ¤āĻž āĻ‰āĻ¨ā§āĻ¨āĻ¤ āĻ•āĻ°āĻž āĻŽā§‚āĻ˛ā§āĻ¯āĻŦāĻžāĻ¨āĨ¤

#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 āĻ āĻĻā§‡āĻ–āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡...

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨