SQL C++ เด เดฒเตเดฒ, JavaScript เด เดฒเตเดฒ. เด เดคเดฟเดจเดพเตฝ, เดฒเตเดเดฟเดเตเดเตฝ เดเดเตเดธเตเดชเตเดฐเดทเดจเตเดเดณเตเดเต เดเดฃเดเตเดเตเดเตเดเตเดเตฝ เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฏเดฟ เดธเดเดญเดตเดฟเดเตเดเตเดจเตเดจเต, เดเดคเต เดเดฐเต เดเดพเดฐเตเดฏเดฎเดฒเตเดฒ:
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
-เดเตเดฏเดฟเตปเดธเต) - เดฐเดฃเตเดเดพเดฎเดคเตเดคเตเดคเต เดเดฐเดฟเดเตเดเตฝ เดเตเดเดฟ เดเดเตเดธเดฟเดเตเดฏเตเดเตเดเต เดเตเดฏเตเดฏเดพเดคเดฟเดฐเดฟเดเตเดเดพเตป เดเดเตเดเดจเตเดฏเตเดเตเดเดฟเดฒเตเด "เด
เดคเดฟเดจเตเดฑเต เดฎเตเตปเดเดฃเดจ เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเดเตเดเดพเตป" เดเดดเดฟเดฏเตเดฎเต?
เดเดคเต เดธเดพเดงเตเดฏเดฎเดพเดฃเตเดจเตเดจเต เดฎเดพเดฑเตเดจเตเดจเต - เด
เตฝเดเตเดฐเดฟเดคเด เดธเดฎเตเดชเดจเด เดฒเตเดเดจเดคเตเดคเดฟเดจเตเดฑเต เดตเดฟเดทเดฏเดคเตเดคเตเดเต เด
เดเตเดคเตเดคเดพเดฃเต
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