เชฆเซเชถเชญเชฐเชจเซ เชธเซเชฒเซเชธ เชเชซเชฟเชธเชจเชพ เชนเชเชพเชฐเซ เชฎเซเชจเซเชเชฐเซ เชฐเซเชเซเชฐเซเชก เชเชฐเซ เชเซ
เชคเซเชฅเซ, เชคเซ เชเชถเซเชเชฐเซเชฏเชเชจเช เชจเชฅเซ เชเซ, เชซเชฐเซ เชเชเชตเชพเชฐ เชธเซเชฅเซ เชตเชงเซ เชฒเซเชก เชฅเชฏเซเชฒ เชกเซเชเชพเชฌเซเชเชฎเชพเชเชจเชพ เชเช เชชเชฐ "เชญเชพเชฐเซ" เชชเซเชฐเชถเซเชจเซเชจเซเช เชตเชฟเชถเซเชฒเซเชทเชฃ เชเชฐเชตเซเช - เชเชชเชฃเชพ เชชเซเชคเชพเชจเชพ
เชคเชฆเซเชชเชฐเชพเชเชค, เชตเชงเซ เชคเชชเชพเชธเชฎเชพเช เชเช เชฐเชธเชชเซเชฐเชฆ เชเชฆเชพเชนเชฐเชฃ เชฌเชนเชพเชฐ เชเชตเซเชฏเซเช เชชเซเชฐเชฅเชฎ เชเชชเซเชเชฟเชฎเชพเชเชเซเชถเชจ เช เชจเซ เชชเชเซ เชเชพเชฎเชเซเชฐเซเชฎเชพเช เชเชเชพเชกเซ เชเชฃเซ เชเซเชฎเซ เชฆเซเชตเชพเชฐเชพ เชคเซเชจเชพ เช เชจเซเชเซเชฐเชฎเชฟเช เชธเชเชธเซเชเชพเชฐเชฟเชคเชพ เชธเชพเชฅเซ เชตเชฟเชจเชเชคเซ, เชเซเชฎเชพเชเชฅเซ เชฆเชฐเซเช เชฎเชพเชคเซเชฐ เชถเซเชฐเซเชทเซเช เชนเซเชคเซเช เชธเชพเชฅเซ เชเชพเชฐเซเชฏ เชเชฐเซ เชเซ.
0: เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเชจเซ เชถเซเช เชเซเชเช เชเซ?
[KDPV
เชเซเชฏเชพเชฐเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชจเชพเชฎ เชฆเซเชตเชพเชฐเชพ "เชเชกเชชเซ" เชถเซเชง เชตเชฟเชถเซ เชตเชพเชค เชเชฐเซ เชเซ เชคเซเชฏเชพเชฐเซ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ เชคเซเชจเซ เช
เชฐเซเชฅ เชถเซเช เชฅเชพเชฏ เชเซ? เชคเซ เชฒเชเชญเช เชเซเชฏเชพเชฐเซเชฏ เชธเชฌเชธเซเชเซเชฐเชฟเชเช เชเซเชตเซ "เชชเซเชฐเชฎเชพเชฃเชฟเช" เชถเซเชง เชฌเชจเซ เชถเชเชคเซ เชจเชฅเซ ... LIKE '%ัะพะทะฐ%'
- เชเชพเชฐเชฃ เชเซ เชชเชเซ เชชเชฐเชฟเชฃเชพเชฎเชฎเชพเช เชฎเชพเชคเซเชฐ เชถเชพเชฎเซเชฒ เชจเชฅเซ 'ะ ะพะทะฐะปะธั'
ะธ 'ะะฐะณะฐะทะธะฝ ะ ะพะทะฐ'
เชชเชฐเชเชคเซ 'ะัะพะทะฐ'
เช
เชจเซ เชคเซ เชชเชฃ 'ะะพะผ ะะตะดะฐ ะะพัะพะทะฐ'
.
เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชฐเซเชเชฟเชเชฆเชพ เชธเซเชคเชฐเซ เชงเชพเชฐเซ เชเซ เชเซ เชคเชฎเซ เชคเซเชจเซ เชชเซเชฐเชฆเชพเชจ เชเชฐเชถเซ เชถเชฌเซเชฆเชจเซ เชถเชฐเซเชเชค เชฆเซเชตเชพเชฐเชพ เชถเซเชงเซ เชถเซเชฐเซเชทเชเชฎเชพเช เช
เชจเซ เชคเซเชจเซ เชตเชงเซ เชธเซเชธเชเชเชค เชฌเชจเชพเชตเซ เชชเชฐ เชถเชฐเซ เชฅเชพเชฏ เชเซ เชฆเชพเชเชฒ เชเชฐเซเชฏเซเช. เช
เชจเซ เชคเชฎเซ เชคเซ เชเชฐเชถเซ เชฒเชเชญเช เชคเชฐเชค เช - เชเชจเซเชเชฐเชฒเชพเชเชจเชฐ เชเชจเชชเซเช เชฎเชพเชเซ.
1: เชเชพเชฐเซเชฏ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชเชฐเซ
เช
เชจเซ เชคเซเชฅเซ เชชเชฃ เชตเชงเซ, เชเช เชตเซเชฏเชเซเชคเชฟ เชเชพเชธ เชฆเชพเชเชฒ เชเชฐเชถเซ เชจเชนเซเช 'ัะพะท ะผะฐะณะฐะท'
, เชเซเชฅเซ เชคเชฎเชพเชฐเซ เชฆเชฐเซเช เชถเชฌเซเชฆเชจเซ เชเชชเชธเชฐเซเช เชฆเซเชตเชพเชฐเชพ เชถเซเชงเชตเชพเชจเซ เชฐเชนเซเชถเซ. เชจเชพ, เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชฎเชพเชเซ เชชเชนเซเชฒเชพเชจเชพ เชถเชฌเซเชฆเซเชจเซ เชนเซเชคเซเชชเซเชฐเซเชตเช "เช
เชจเซเชกเชฐเชธเซเชชเซเชธเชฟเชซเชพเชฏ" เชเชฐเชตเชพ เชเชฐเชคเชพเช เชเซเชฒเซเชฒเชพ เชถเชฌเซเชฆ เชฎเชพเชเซ เชเชกเชชเซ เชธเชเชเซเชคเชจเซ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชเชชเชตเชพเชจเซเช เชเซเชฌ เชธเชฐเชณ เชเซ - เชเซเชเชชเชฃ เชถเซเชง เชเชจเซเชเชฟเชจ เชเชจเซ เชเซเชตเซ เชฐเซเชคเซ เชนเซเชจเซเชกเชฒ เชเชฐเซ เชเซ เชคเซ เชเซเช.
เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ เช
เชงเชฟเชเชพเชฐ เชธเชฎเชธเซเชฏเชพ เชฎเชพเชเซ เชเชฐเซเชฐเชฟเชฏเชพเชคเซ เชเชกเชตเซ เช เช
เชกเชงเชพ เชเชฐเชคเชพเช เชตเชงเซ เชเชเซเชฒ เชเซ. เชเซเชฏเชพเชฐเซเช เชธเชพเชตเชเซเชค เชเชชเชฏเซเช เชเซเชธ เชตเชฟเชถเซเชฒเซเชทเชฃ
เช เชฎเซเชฐเซเชค เชตเชฟเชเชพเชธเชเชฐเซเชคเชพ เชถเซเช เชเชฐเซ เชเซ?
1.0: เชฌเชพเชนเซเชฏ เชถเซเชง เชเชเชเซเชจ
เชเชน, เชถเซเชง เชฎเซเชถเซเชเซเชฒ เชเซ, เชนเซเช เชเชเชเชชเชฃ เชเชฐเชตเชพ เชฎเชพเชเชเชคเซ เชจเชฅเซ - เชเชพเชฒเซ เชคเซเชจเซ เชกเซเชตเซเชชเซเชธเชจเซ เชเชชเซเช! เชคเซเชฎเชจเซ เชกเซเชเชพเชฌเซเชเชฎเชพเช เชฌเชนเชพเชฐเชจเซเช เชธเชฐเซเช เชเชจเซเชเชฟเชจ เชเชฎเชพเชตเชตเชพ เชฆเซ: เชธเซเชซเชฟเชจเซเชเซเชธ, เชเชฒเชพเชธเซเชเชฟเช เชธเชฐเซเช,...
เชธเชฟเชเชเซเชฐเชจเชพเชเชเซเชถเชจ เช
เชจเซ เชซเซเชฐเชซเชพเชฐเซเชจเซ เชเชกเชชเชจเชพ เชธเชเชฆเชฐเซเชญเชฎเชพเช เชถเซเชฐเชฎ-เชธเชเชจ เชนเซเชตเชพ เชเชคเชพเช เชเชพเชฎ เชเชฐเชตเชพเชจเซ เชตเชฟเชเชฒเซเชช. เชชเชฐเชเชคเซ เช
เชฎเชพเชฐเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช เชจเชนเซเช, เชเชพเชฐเชฃ เชเซ เชถเซเชง เชฆเชฐเซเช เชเซเชฒเชพเชฏเชเช เชฎเชพเชเซ เชคเซเชจเชพ เชเชเชพเชเชจเซเช เชกเซเชเชพเชจเชพ เชฎเชพเชณเชเชพเชฎเชพเช เช เชนเชพเชฅ เชงเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เช
เชจเซ เชกเซเชเชพเชฎเชพเช เชเชเชฆเชฎ เชเชเซเช เชชเชฐเชฟเชตเชฐเซเชคเชจเชเซเชทเชฎเชคเชพ เชเซ - เช
เชจเซ เชเซ เชฎเซเชจเซเชเชฐ เชนเชตเซ เชเชพเชฐเซเชกเชฎเชพเช เชฆเชพเชเชฒ เชฅเชฏเชพ เชเซ 'ะะฐะณะฐะทะธะฝ ะ ะพะทะฐ'
, เชชเชเซ 5-10 เชธเซเชเชจเซเชก เชชเชเซ เชคเซเชจเซ เชชเชนเซเชฒเซเชฅเซ เช เชฏเชพเชฆ เชนเชถเซ เชเซ เชคเซ เชคเซเชฏเชพเช เชคเซเชจเซเช เชเชฎเซเชฒ เชธเซเชเชตเชตเชพเชจเซเช เชญเซเชฒเซ เชเชฏเซ เชเซ เช
เชจเซ เชคเซเชจเซ เชถเซเชงเซเชจเซ เชคเซเชจเซ เชธเซเชงเชพเชฐเชตเชพ เชฎเชพเชเชเซ เชเซ.
เชคเซเชฅเซ - เชเชพเชฒเซ "เชกเชพเชเชพเชฌเซเชเชฎเชพเช เชธเซเชงเซเช" เชถเซเชงเซ. เชธเชฆเชจเชธเซเชฌเซ, PostgreSQL เช เชฎเชจเซ เช เชเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ, เช เชจเซ เชฎเชพเชคเซเชฐ เชเช เชตเชฟเชเชฒเซเชช เช เชจเชนเซเช - เช เชฎเซ เชคเซเชฎเชจเซ เชเซเชเชถเซเช.
1.1: "เชชเซเชฐเชพเชฎเชพเชฃเชฟเช" เชธเชฌเชธเซเชเซเชฐเชฟเชเช
เช
เชฎเซ "เชธเชฌเชธเซเชเซเชฐเชฟเชเช" เชถเชฌเซเชฆเชจเซ เชตเชณเชเซ เชฐเชนเซเช เชเซเช. เชชเชฐเชเชคเซ เชธเชฌเชธเซเชเซเชฐเชฟเชเช (เช
เชจเซ เชจเชฟเชฏเชฎเชฟเชค เช
เชญเชฟเชตเซเชฏเชเซเชคเชฟ เชฆเซเชตเชพเชฐเชพ เชชเชฃ!) เชฆเซเชตเชพเชฐเชพ เช
เชจเซเชเซเชฐเชฎเชฃเชฟเชเชพ เชถเซเชง เชฎเชพเชเซ เชเช เชเชคเซเชคเชฎ เชเซ
เชเชพเชฒเซ เชฎเซเชกเซเชฒเชจเซ เชธเชฐเชณ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ เชจเซเชเซเชจเซ เชชเซเชฒเซเช เชฒเซเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซเช:
CREATE TABLE firms(
id
serial
PRIMARY KEY
, name
text
);
เช เชฎเซ เชคเซเชฏเชพเช เชตเชพเชธเซเชคเชตเชฟเช เชธเชเชธเซเชฅเชพเชเชจเชพ 7.8 เชฎเชฟเชฒเชฟเชฏเชจ เชฐเซเชเซเชฐเซเชก เช เชชเชฒเซเชก เชเชฐเซเช เชเซเช เช เชจเซ เชคเซเชฎเชจเซ เช เชจเซเชเซเชฐเชฎเชฟเชค เชเชฐเซเช เชเซเช:
CREATE EXTENSION pg_trgm;
CREATE INDEX ON firms USING gin(lower(name) gin_trgm_ops);
เชเชพเชฒเซ เชเชเชคเชฐเชฐเซเชเซเชฏ เชถเซเชง เชฎเชพเชเซ เชชเซเชฐเชฅเชฎ 10 เชฐเซเชเซเชฐเซเชกเซเชธ เชเซเชเช:
SELECT
*
FROM
firms
WHERE
lower(name) ~ ('(^|s)' || 'ัะพะทะฐ')
ORDER BY
lower(name) ~ ('^' || 'ัะพะทะฐ') DESC -- ัะฝะฐัะฐะปะฐ "ะฝะฐัะธะฝะฐััะธะตัั ะฝะฐ"
, lower(name) -- ะพััะฐะปัะฝะพะต ะฟะพ ะฐะปัะฐะฒะธัั
LIMIT 10;
เชธเชพเชฐเซเช, เชคเซ... 26ms, 31MB เชกเซเชเชพ เชตเชพเชเชเซ เช เชจเซ 1.7K เชเชฐเชคเชพเช เชตเชงเซ เชซเชฟเชฒเซเชเชฐ เชเชฐเซเชฒเชพ เชฐเซเชเซเชฐเซเชกเซเชธ - 10 เชถเซเชงเซเชฒเชพ เชฒเซเชเซ เชฎเชพเชเซ. เชเชตเชฐเชนเซเชก เชเชฐเซเช เชเซเชฌ เชตเชงเชพเชฐเซ เชเซ, เชถเซเช เชคเซเชฏเชพเช เชเชเชเช เชตเชงเซ เชเชพเชฐเซเชฏเชเซเชทเชฎ เชจเชฅเซ?
1.2: เชเซเชเซเชธเซเช เชฆเซเชตเชพเชฐเชพ เชถเซเชงเซ? เชคเซ FTS เชเซ!
เชเชฐเซเชเชฐ, PostgreSQL เชเซเชฌ เช เชถเชเซเชคเชฟเชถเชพเชณเซ เชชเซเชฐเชฆเชพเชจ เชเชฐเซ เชเซ
CREATE INDEX ON firms USING gin(to_tsvector('simple'::regconfig, lower(name)));
SELECT
*
FROM
firms
WHERE
to_tsvector('simple'::regconfig, lower(name)) @@ to_tsquery('simple', 'ัะพะทะฐ:*')
ORDER BY
lower(name) ~ ('^' || 'ัะพะทะฐ') DESC
, lower(name)
LIMIT 10;
เช เชนเซเช เชเซเชตเซเชฐเซ เชเชเซเชเซเชเซเชฏเซเชถเชจเชจเซ เชธเชฎเชพเชเชคเชฐเชคเชพเช เช เชฎเชจเซ เชฅเซเชกเซ เชฎเชฆเชฆ เชเชฐเซ, เชธเชฎเชฏเชจเซ เช เชกเชงเซ เชเชฐเซ เชฆเซเชงเซ 11ms. เช เชจเซ เช เชฎเชพเชฐเซ 1.5 เชเชฃเซเช เชเชเซเช เชตเชพเชเชเชตเซเช เชชเชกเซเชฏเซเช - เชเซเชฒ 20MB. เชชเชฐเชเชคเซ เช เชนเซเช, เชเชเซเช, เชตเชงเซ เชธเชพเชฐเซเช, เชเชพเชฐเชฃ เชเซ เชเชชเชฃเซ เชตเชพเชเชเซเช เชเซเช เชคเซเชเชฒเซเช เชฎเซเชเซเช เชตเซเชฒเซเชฏเซเชฎ, เชเซเชถ เชเซเชเซ เชเชตเชพเชจเซ เชถเชเซเชฏเชคเชพเช เชตเชงเชพเชฐเซ เชเซ, เช เชจเซ เชกเชฟเชธเซเชเชฎเชพเชเชฅเซ เชตเชพเชเชเซเชฒเชพ เชกเซเชเชพเชจเชพ เชฆเชฐเซเช เชตเชงเชพเชฐเชพเชจเชพ เชชเซเชทเซเช เชตเชฟเชจเชเชคเซ เชฎเชพเชเซ เชธเชเชญเชตเชฟเชค "เชฌเซเชฐเซเช" เชเซ.
1.3: เชนเชเซ เชชเชฃ เชเชฎเซ เชเซ?
เช เชเชพเชเชจเซ เชตเชฟเชจเชเชคเซ เชฆเชฐเซเช เชฎเชพเชเซ เชธเชพเชฐเซ เชเซ, เชชเชฐเชเชคเซ เชคเชฎเซ เชคเซเชจเซ เชฆเชฟเชตเชธเชฎเชพเช เชเช เชฒเชพเช เชตเชเชค เชเซเชเชเซ เชคเซ เช เชคเซ เชเชตเชถเซ 2TB เชกเซเชเชพ เชตเชพเชเชเซ. เชถเซเชฐเซเชทเซเช เชเชฟเชธเซเชธเชพเชฎเชพเช, เชฎเซเชฎเชฐเซเชฎเชพเชเชฅเซ, เชชเชฐเชเชคเซ เชเซ เชคเชฎเซ เชเชฎเชจเชธเซเชฌ เชเซ, เชคเซ เชชเชเซ เชกเชฟเชธเซเชเชฎเชพเชเชฅเซ. เชคเซ เชเชพเชฒเซ เชคเซเชจเซ เชจเชพเชจเซ เชเชฐเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซเช.
เชเชพเชฒเซ เชฏเชพเชฆ เชเชฐเซเช เชเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชถเซเช เชเซเชตเชพ เชฎเชพเชเชเซ เชเซ เชชเซเชฐเชฅเชฎ "เชเซเชจเซ เชธเชพเชฅเซ เชถเชฐเซ เชฅเชพเชฏ เชเซ...". เชคเซเชฅเซ เช เชคเซเชจเชพ เชถเซเชฆเซเชง เชธเซเชตเชฐเซเชชเชฎเชพเช เชเซ text_pattern_ops
! เช
เชจเซ เชฎเชพเชคเซเชฐ เชเซ เช
เชฎเชพเชฐเซ เชชเชพเชธเซ 10 เชเซเชเชฒเชพ เชฐเซเชเซเชฐเซเชกเซเชธ "เชชเซเชฐเชคเชพ เชจ เชนเซเชฏ" เชเซ เช
เชฎเซ เชถเซเชงเซ เชฐเชนเซเชฏเชพ เชเซเช, เชคเซ เช
เชฎเชพเชฐเซ FTS เชถเซเชงเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชคเซเชฎเชจเซ เชตเชพเชเชเชตเชพเชจเซเช เชธเชฎเชพเชชเซเชค เชเชฐเชตเซเช เชชเชกเชถเซ:
CREATE INDEX ON firms(lower(name) text_pattern_ops);
SELECT
*
FROM
firms
WHERE
lower(name) LIKE ('ัะพะทะฐ' || '%')
LIMIT 10;
เชเชคเซเชคเชฎ เชชเซเชฐเชฆเชฐเซเชถเชจ - เชเซเชฒ 0.05ms เช เชจเซ 100KB เชเชฐเชคเชพเช เชฅเซเชกเซเช เชตเชงเชพเชฐเซ เชตเชพเชเชเชตเซเช! เชซเชเซเชค เชเชชเชฃเซ เช เชญเซเชฒเซ เชเชฏเชพ เชจเชพเชฎ เชฆเซเชตเชพเชฐเชพ เชธเซเชฐเซเช เชเชฐเซเชเซเชฅเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชชเชฐเชฟเชฃเชพเชฎเซเชฎเชพเช เชเซเชตเชพเช เชจ เชเชพเชฏ:
SELECT
*
FROM
firms
WHERE
lower(name) LIKE ('ัะพะทะฐ' || '%')
ORDER BY
lower(name)
LIMIT 10;
เชเชน, เชนเชตเซ เชเชเชเช เชเชเชฒเซเช เชธเซเชเชฆเชฐ เชจเชฅเซ - เชเชตเซเช เชฒเชพเชเซ เชเซ เชเซ เชคเซเชฏเชพเช เชเซเช เช เชจเซเชเซเชฐเชฎเชฃเชฟเชเชพ เชเซ, เชชเชฐเชเชคเซ เชธเซเชฐเซเชเชฟเชเช เชคเซเชฎเชพเชเชฅเซ เชชเชธเชพเชฐ เชฅเช เชเชพเชฏ เชเซ... เช เชฒเชฌเชคเซเชค, เชคเซ เชชเชนเซเชฒเชพเชจเชพ เชตเชฟเชเชฒเซเชช เชเชฐเชคเชพเช เชเชฃเซ เชตเชเชค เชตเชงเซ เช เชธเชฐเชเชพเชฐเช เชเซ, เชชเชฐเชเชคเซ...
1.4: "เชซเชพเชเชฒ เชธเชพเชฅเซ เชธเชฎเชพเชชเซเชค เชเชฐเซ"
เชชเชฐเชเชคเซ เชคเซเชฏเชพเช เชเช เช เชจเซเชเซเชฐเชฎเชฃเชฟเชเชพ เชเซ เชเซ เชคเชฎเชจเซ เชถเซเชฐเซเชฃเซ เชฆเซเชตเชพเชฐเชพ เชถเซเชงเชตเชพ เชฎเชพเชเซ เชชเชฐเชตเชพเชจเชเซ เชเชชเซ เชเซ เช เชจเซ เชนเชเซ เชชเชฃ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ เชธเซเชฐเซเชเชฟเชเชเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ - เชจเชฟเชฏเชฎเชฟเชค btree!
CREATE INDEX ON firms(lower(name));
เชซเชเซเชค เชคเซเชจเชพ เชฎเชพเชเซเชจเซ เชตเชฟเชจเชเชคเซ "เชฎเซเชจเซเชฏเซเช เชฒเซ เชเชเชคเซเชฐเชฟเชค" เชเชฐเชตเชพเชจเซ เชฐเชนเซเชถเซ:
SELECT
*
FROM
firms
WHERE
lower(name) >= 'ัะพะทะฐ' AND
lower(name) <= ('ัะพะทะฐ' || chr(65535)) -- ะดะปั UTF8, ะดะปั ะพะดะฝะพะฑะฐะนัะพะฒัั
- chr(255)
ORDER BY
lower(name)
LIMIT 10;
เชเชคเซเชคเชฎ - เชธเซเชฐเซเชเชฟเชเช เชเชพเชฎ เชเชฐเซ เชเซ, เช เชจเซ เชธเชเชธเชพเชงเชจเชจเซ เชตเชชเชฐเชพเชถ "เชฎเชพเชเชเซเชฐเซเชธเซเชเซเชชเชฟเช" เชฐเชนเซ เชเซ, "เชถเซเชฆเซเชง" FTS เชเชฐเชคเชพเช เชนเชเชพเชฐเซ เชเชฃเซ เชตเชงเซ เช เชธเชฐเชเชพเชฐเช! เชเซ เชฌเชพเชเซ เชเซ เชคเซ เชคเซเชจเซ เชเช เช เชตเชฟเชจเชเชคเซเชฎเชพเช เชเชเชธเชพเชฅเซ เชฎเซเชเชตเชพเชจเซเช เชเซ:
(
SELECT
*
FROM
firms
WHERE
lower(name) >= 'ัะพะทะฐ' AND
lower(name) <= ('ัะพะทะฐ' || chr(65535)) -- ะดะปั UTF8, ะดะปั ะพะดะฝะพะฑะฐะนัะพะฒัั
ะบะพะดะธัะพะฒะพะบ - chr(255)
ORDER BY
lower(name)
LIMIT 10
)
UNION ALL
(
SELECT
*
FROM
firms
WHERE
to_tsvector('simple'::regconfig, lower(name)) @@ to_tsquery('simple', 'ัะพะทะฐ:*') AND
lower(name) NOT LIKE ('ัะพะทะฐ' || '%') -- "ะฝะฐัะธะฝะฐััะธะตัั ะฝะฐ" ะผั ัะถะต ะฝะฐัะปะธ ะฒััะต
ORDER BY
lower(name) ~ ('^' || 'ัะพะทะฐ') DESC -- ะธัะฟะพะปัะทัะตะผ ัั ะถะต ัะพััะธัะพะฒะบั, ััะพะฑั ะะ ะฟะพะนัะธ ะฟะพ btree-ะธะฝะดะตะบัั
, lower(name)
LIMIT 10
)
LIMIT 10;
เชจเซเชเชง เชเชฐเซ เชเซ เชฌเซเชเซ เชธเชฌเชเซเชตเซเชฐเซ เชเชฒเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชเซ เชฎเชพเชคเซเชฐ เชเซ เชชเซเชฐเชฅเชฎ เช
เชชเซเชเซเชทเชฟเชค เชเชฐเชคเชพเช เชเชเซเช เชชเชฐเชค เชเชฐเซ เชเซ เชเซเชฒเซเชฒเชพ LIMIT
เชฐเซเชเชพเชเชจเซ เชธเชเชเซเชฏเชพ. เชนเซเช เชเซเชตเซเชฐเซ เชเชชเซเชเชฟเชฎเชพเชเชเซเชถเชจเชจเซ เช เชชเชฆเซเชงเชคเชฟ เชตเชฟเชถเซ เชตเชพเชค เชเชฐเซ เชฐเชนเซเชฏเซ เชเซเช
เชคเซ เชนเชพ, เชนเชตเซ เชเชชเชฃเซ เชชเชพเชธเซ เชเซเชฌเชฒ เชชเชฐ เชฌเซเชเซเชฐเซ เช เชจเซ เชเชฟเชจ เชฌเชเชจเซ เชเซ, เชชเชฐเชเชคเซ เชเชเชเชกเชพเชเซเชฏ เชฐเซเชคเซ เชคเซ เชคเชพเชฐเชฃ เชเชชเซ เชเซ เชเซ 10% เชฅเซ เชเชเซ เชตเชฟเชจเชเชคเซเช เชฌเซเชเชพ เชฌเซเชฒเซเชเชจเชพ เช เชฎเชฒ เชธเซเชงเซ เชชเชนเซเชเชเซ เชเซ. เชเชเชฒเซ เชเซ, เชเชพเชฐเซเชฏ เชฎเชพเชเซ เช เชเชพเชเชฅเซ เชเชพเชฃเซเชคเซ เชเชตเซ เชฒเชพเชเซเชทเชฃเชฟเช เชฎเชฐเซเชฏเชพเชฆเชพเช เชธเชพเชฅเซ, เช เชฎเซ เชธเชฐเซเชตเชฐ เชธเชเชธเชพเชงเชจเซเชจเชพ เชเซเชฒ เชตเชชเชฐเชพเชถเชจเซ เชฒเชเชญเช เชนเชเชพเชฐ เชเชฃเซ เชเชเชพเชกเซ เชถเชเซเชฏเชพ เชเซเช!
1.5*: เชเชชเชฃเซ เชซเชพเชเชฒ เชตเชฟเชจเชพ เชเชฐเซ เชถเชเซเช เชเซเช
เชเชชเชฐ LIKE
เช
เชฎเชจเซ เชเซเชเชพ เชธเซเชฐเซเชเชฟเชเชเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชฅเซ เช
เชเชเชพเชตเชตเชพเชฎเชพเช เชเชตเซเชฏเชพ เชนเชคเชพ. เชชเชฐเชเชคเซ เชเชชเชฐเซเชเชฐเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชคเซเชจเซ "เชธเชพเชเชพ เชฎเชพเชฐเซเช เชชเชฐ เชธเซเช" เชเชฐเซ เชถเชเชพเชฏ เชเซ:
เชฎเซเชณเชญเซเชค เชฐเซเชคเซ เชคเซ เชงเชพเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ
ASC
. เชตเชงเซเชฎเชพเช, เชคเชฎเซ เชเชฒเชฎเชฎเชพเช เชเซเชเซเชเชธ เชธเซเชฐเซเช เชเชชเชฐเซเชเชฐเชจเซเช เชจเชพเชฎ เชธเซเชชเชทเซเช เชเชฐเซ เชถเชเซ เชเซUSING
. เชธเซเชฐเซเช เชเชชเชฐเซเชเชฐ เชฌเซ-เชเซเชฐเซ เชเชชเชฐเซเชเชฐเซเชธเชจเชพ เชเซเชเชฒเชพเช เชชเชฐเชฟเชตเชพเชฐเชจเชพ เชเชฐเชคเชพเช เชเชเชพ เช เชฅเชตเชพ เชตเชงเซเชจเชพ เชธเชญเซเชฏ เชนเซเชตเชพ เชเซเชเช.ASC
เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ เชธเชฎเชเชเซเชทUSING <
ะธDESC
เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ เชธเชฎเชเชเซเชทUSING >
.
เช
เชฎเชพเชฐเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช, "เชเชเซเช" เชเซ ~<~
:
SELECT
*
FROM
firms
WHERE
lower(name) LIKE ('ัะพะทะฐ' || '%')
ORDER BY
lower(name) USING ~<~
LIMIT 10;
2: เชตเชฟเชจเชเชคเซเช เชเซเชตเซ เชฐเซเชคเซ เชเชพเชเซ เชฅเช เชเชพเชฏ เชเซ
เชนเชตเซ เช เชฎเซ เช เชฎเชพเชฐเซ เชตเชฟเชจเชเชคเซเชจเซ เช เชฎเชนเชฟเชจเชพ เช เชฅเชตเชพ เชเช เชตเชฐเซเชท เชฎเชพเชเซ "เชเชเชณเชตเชพ" เชฎเชพเชเซ เชเซเชกเซ เชฆเชเช เชเซเช, เช เชจเซ เชฎเซเชฎเชฐเซเชจเชพ เชเซเชฒ เชฆเซเชจเชฟเช "เชชเชฎเซเชชเชฟเชเช" เชจเชพ เชธเซเชเชเชพเชเชเซ เชธเชพเชฅเซ เชคเซเชจเซ เชซเชฐเซเชฅเซ "เชเซเช เชชเชฐ" เชถเซเชงเซเชจเซ เช เชฎเชจเซ เชเชถเซเชเชฐเซเชฏ เชฅเชพเชฏ เชเซ (เชฌเชซเชฐเซเชธ เชนเชฟเช เชถเซเชฐ เชเชฐเซ เชเซ) เชฎเชพเช 5.5TB - เชเชเชฒเซ เชเซ, เชคเซ เชฎเซเชณ เชเชฐเชคเชพเช เชชเชฃ เชตเชงเซ.
เชจเชพ, เช เชฒเชฌเชคเซเชค, เช เชฎเชพเชฐเซ เชงเชเชงเซ เชตเชงเซเชฏเซ เชเซ เช เชจเซ เช เชฎเชพเชฐเซ เชตเชฐเซเชเชฒเซเชก เชตเชงเซเชฏเซ เชเซ, เชชเชฃ เชคเซเชเชฒเซ เช เชฐเชเชฎเชฅเซ เชจเชนเซเช! เชเชจเซ เช เชฐเซเชฅ เช เชเซ เชเซ เช เชนเซเช เชเชเชเช เชเซเชเชเชตเชฃเชญเชฐเซเชฏเซเช เชเซ - เชเชพเชฒเซ เชคเซเชจเซ เชถเซเชงเซ เชเชพเชขเซเช.
2.1: เชชเซเชเชฟเชเชเชจเซ เชเชจเซเชฎ
เช เชฎเซเช เชธเชฎเชฏเซ, เชฌเซเชเซ เชกเซเชตเชฒเชชเชฎเซเชจเซเช เชเซเชฎ เชเชกเชชเซ เชธเชฌเชธเซเชเซเชฐเชฟเชชเซเช เชถเซเชงเชฎเชพเชเชฅเซ เชฐเชเชฟเชธเซเชเซเชฐเซเชฎเชพเช เชธเชฎเชพเชจ, เชชเชฐเชเชคเซ เชตเชฟเชธเซเชคเซเชค เชชเชฐเชฟเชฃเชพเชฎเซ เชธเชพเชฅเซ "เชเชฎเซเชช" เชเชฐเชตเชพเชจเซเช เชถเชเซเชฏ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเชเชคเซ เชนเชคเซ. เชชเซเช เชจเซเชตเชฟเชเซเชถเชจ เชตเชฟเชจเชพ เชฐเชเชฟเชธเซเชเซเชฐเซ เชถเซเช เชเซ? เชเชพเชฒเซ เชคเซเชจเซ เชธเซเชเซเชฐเซ เชเชฐเซเช!
( ... LIMIT <N> + 10)
UNION ALL
( ... LIMIT <N> + 10)
LIMIT 10 OFFSET <N>;
เชนเชตเซ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพ เชฎเชพเชเซ เชเซเชเชชเชฃ เชคเชฃเชพเชต เชตเชฟเชจเชพ "เชชเซเชทเซเช -เชฆเชฐ-เชชเซเชทเซเช " เชฒเซเชกเชฟเชเช เชธเชพเชฅเซ เชถเซเชง เชชเชฐเชฟเชฃเชพเชฎเซเชจเซ เชฐเชเชฟเชธเซเชเซเชฐเซ เชฌเชคเชพเชตเชตเชพเชจเซเช เชถเชเซเชฏ เชนเชคเซเช.
เช เชฒเชฌเชคเซเชค, เชนเชเซเชเชคเชฎเชพเช, เชกเซเชเชพเชจเชพ เชฆเชฐเซเช เช เชจเซเชเชพเชฎเซ เชชเซเชทเซเช เชฎเชพเชเซ เชตเชงเซเชจเซ เชตเชงเซ เชตเชพเชเชเชตเชพเชฎเชพเช เชเชตเซ เชเซ (เชฌเชงเซเช เช เชเชพเชเชจเชพ เชธเชฎเชฏเชฅเซ, เชเซเชจเซ เชเชชเชฃเซ เชเชพเชขเซ เชจเชพเชเซเชถเซเช, เชเชชเชฐเชพเชเชค เชเชฐเซเชฐเซ "เชชเซเชเชเชกเซ") - เชเชเชฒเซ เชเซ, เช เชเช เชธเซเชชเชทเซเช เชเชจเซเชเชฟเชชเซเชเชฐเซเชจ เชเซ. เชชเชฐเชเชคเซ เชเชจเซเชเชฐเชซเซเชธเชฎเชพเช เชธเชเชเซเชฐเชนเชฟเชค เชเซเชฎเชพเชเชฅเซ เชเชเชฒเชพ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชจ เชชเชฐ เชถเซเชง เชถเชฐเซ เชเชฐเชตเซ เชตเชงเซ เชฏเซเชเซเชฏ เชฐเชนเซเชถเซ, เชชเชฐเชเชคเซ เชคเซ เชตเชฟเชถเซ เชฌเซเชเซ เชตเชพเชฐ.
2.2: เชฎเชพเชฐเซ เชเชเชเช เชตเชฟเชเชฟเชคเซเชฐ เชเซเชเช เชเซ
เช เชฎเซเช เชธเชฎเชฏเซ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพ เชเชเซเชเชคเซ เชนเชคเซ เชกเซเชเชพ เชธเชพเชฅเซ เชชเชฐเชฟเชฃเชพเชฎเซ เชจเชฎเซเชจเชพเชจเซ เชตเชฟเชตเชฟเชงเชคเชพ เชเชชเซ เช เชจเซเชฏ เชเซเชทเซเชเชเชฎเชพเชเชฅเซ, เชเซเชจเชพ เชฎเชพเชเซ เชธเชฎเชเซเชฐ เช เชเชพเชเชจเซ เชตเชฟเชจเชเชคเซ CTE เชจเซ เชฎเซเชเชฒเชตเชพเชฎเชพเช เชเชตเซ เชนเชคเซ:
WITH q AS (
...
LIMIT <N> + 10
)
SELECT
*
, (SELECT ...) sub_query -- ะบะฐะบะพะน-ัะพ ะทะฐะฟัะพั ะบ ัะฒัะทะฐะฝะฝะพะน ัะฐะฑะปะธัะต
FROM
q
LIMIT 10 OFFSET <N>;
เช เชจเซ เชคเซเชฎ เชเชคเชพเช, เชคเซ เชเชฐเชพเชฌ เชจเชฅเซ, เชเชพเชฐเชฃ เชเซ เชธเชฌเชเซเชตเซเชฐเซเชจเซเช เชฎเซเชฒเซเชฏเชพเชเชเชจ เชซเชเซเชค 10 เชชเชฐเชค เชเชฐเซเชฒเชพ เชฐเซเชเซเชฐเซเชกเซเชธ เชฎเชพเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชเซ เชจเชนเซเช ...
2.3: DISTINCT เชธเชเชตเซเชฆเชจเชพเชนเซเชจ เช เชจเซ เชจเชฟเชฐเซเชฆเชฏ เชเซ
2เชเซ เชธเชฌเชเซเชตเซเชฐเซเชฎเชพเชเชฅเซ เชเชตเซ เชเชคเซเชเซเชฐเชพเชเชคเชฟเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชฎเชพเช เชเซเชฏเชพเชเช เชเซเชตเชพเช เชเชฏเซ NOT LIKE
เชถเชฐเชค. เชคเซ เชธเซเชชเชทเซเช เชเซ เชเซ เช เชชเชเซ UNION ALL
เชชเชพเชเชพ เชซเชฐเชตเชพเชจเซเช เชถเชฐเซ เชเชฐเซเชฏเซเช เชเซเชเชฒเซเช เชเชจเซเชเซเชฐเซเช เชฌเซ เชตเชพเชฐ - เชชเซเชฐเชฅเชฎ เชฒเซเชเซเชจเซ เชถเชฐเซเชเชคเชฎเชพเช เชเซเชตเชพ เชฎเชณเซ เชเซ, เช
เชจเซ เชชเชเซ เชซเชฐเซเชฅเซ - เช เชฒเซเชเซเชจเชพ เชชเซเชฐเชฅเชฎ เชถเชฌเซเชฆเชจเซ เชถเชฐเซเชเชคเชฎเชพเช. เชฎเชฐเซเชฏเชพเชฆเชพเชฎเชพเช, 2เชเซ เชธเชฌเชเซเชตเซเชฐเซเชจเชพเช เชคเชฎเชพเชฎ เชฐเซเชเซเชฐเซเชกเซเชธ เชชเชนเซเชฒเชพเชจเชพเช เชฐเซเชเซเชฐเซเชกเซเชธ เชธเชพเชฅเซ เชฎเซเช เชเชฐเซ เชถเชเซ เชเซ.
เชเชพเชฐเชฃ เชถเซเชงเชตเชพเชจเซ เชฌเชฆเชฒเซ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพ เชถเซเช เชเชฐเซ เชเซ?.. เชเซเช เชชเซเชฐเชถเซเชจ เชจเชฅเซ!
- เชเชฆ เชฌเชฎเชฃเซเช เชฎเซเชณ เชจเชฎเซเชจเชพเช
- DISTINCT เชฒเชพเชเซ เชเชฐเซเชฆเชฐเซเช เชฒเชพเชเชจเชจเชพ เชฎเชพเชคเซเชฐ เชเช เช เชฆเชพเชเชฒเชพ เชฎเซเชณเชตเชตเชพ เชฎเชพเชเซ
WITH q AS (
( ... LIMIT <2 * N> + 10)
UNION ALL
( ... LIMIT <2 * N> + 10)
LIMIT <2 * N> + 10
)
SELECT DISTINCT
*
, (SELECT ...) sub_query
FROM
q
LIMIT 10 OFFSET <N>;
เชเชเชฒเซ เชเซ, เชคเซ เชธเซเชชเชทเซเช เชเซ เชเซ เชชเชฐเชฟเชฃเชพเชฎ, เช เชเชคเซ, เชฌเชฐเชพเชฌเชฐ เช เช เชเซ, เชชเชฐเชเชคเซ 2เชเซ CTE เชธเชฌเชเซเชตเซเชฐเซ เชฎเชพเช "เชเชกเชตเชพเชจเซ" เชคเช เชเชฃเซ เชตเชงเซ เชเช เชเซ, เช เชจเซ เช เชตเชฟเชจเชพ เชชเชฃ, เชธเซเชชเชทเซเชเชชเชฃเซ เชตเชงเซ เชตเชพเชเชเชตเชพ เชฏเซเชเซเชฏ.
เชชเชฐเชเชคเซ เช เชธเซเชฅเซ เชฆเซเชเชเชฆ เชฌเชพเชฌเชค เชจเชฅเซ. เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเช เชชเชธเชเชฆ เชเชฐเชตเชพเชจเซเช เชเชนเซเชฏเซเช เชคเซเชฏเชพเชฐเชฅเซ DISTINCT
เชเซเชเซเชเชธ เชฒเซเชเซ เชฎเชพเชเซ เชจเชนเซเช, เชชเชฐเชเชคเซ เชเช เชธเชพเชฅเซ เชคเชฎเชพเชฎ เชเซเชทเซเชคเซเชฐเซ เชฎเชพเชเซ เชฐเซเชเซเชฐเซเชกเซเชธ, เชชเชเซ เชธเชฌ_เชเซเชตเซเชฐเซ เชซเซเชฒเซเชก โ เชธเชฌเชเซเชตเซเชฐเซเชจเซเช เชชเชฐเชฟเชฃเชพเชฎ โ เชคเซเชฏเชพเช เชเชชเชฎเซเชณเซ เชธเชฎเชพเชตเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชนเชคเซเช. เชนเชตเซ, เชเชฒเชพเชตเชตเชพ เชฎเชพเชเซ DISTINCT
, เชกเซเชเชพเชฌเซเช เชชเชนเซเชฒเชพเชฅเซ เช เชเชเซเชเชฟเชเซเชฏเซเช เชเชฐเชตเชพเชจเซเช เชนเชคเซเช 10 เชธเชฌเชเซเชตเซเชฐเซเช เชจเชนเซเช, เชชเชฐเชเชคเซ เชคเชฎเชพเชฎ <2 * N> + 10!
2.4: เชฌเชงเชพ เชเชชเชฐ เชธเชนเชเชพเชฐ!
เชคเซเชฅเซ, เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเช เชเซเชตเชคเชพ เชนเชคเชพ - เชคเซเช เชชเชฐเซเชถเชพเชจ เชเชฐเชคเชพ เชจเชนเซเชคเชพ, เชเชพเชฐเชฃ เชเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชชเชพเชธเซ เชธเซเชชเชทเซเชเชชเชฃเซ เชฆเชฐเซเช เช เชจเซเชเชพเชฎเซ "เชชเซเชทเซเช " เชชเซเชฐเชพเชชเซเชค เชเชฐเชตเชพเชฎเชพเช เชคเซเชตเซเชฐ เชฎเชเชฆเซ เชธเชพเชฅเซ เชจเซเชเชงเชชเชพเชคเซเชฐ เชเชจ เชฎเซเชฒเซเชฏเซ เชธเชพเชฅเซ เชฐเชเชฟเชธเซเชเซเชฐเซเชจเซ "เชตเซเชฏเชตเชธเซเชฅเชฟเชค" เชเชฐเชตเชพ เชฎเชพเชเซ เชชเซเชฐเชคเซ เชงเซเชฐเช เชจเชนเซเชคเซ.
เชเซเชฏเชพเช เชธเซเชงเซ เช เชจเซเชฏ เชตเชฟเชญเชพเชเชจเชพ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเช เชคเซเชฎเชจเซ เชชเชพเชธเซ เชเชตเซเชฏเชพ เช เชจเซ เชเชตเซ เช เชจเซเชเซเชณ เชชเชฆเซเชงเชคเชฟเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพ เชฎเชพเชเชเชคเชพ เชจ เชนเชคเชพ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชถเซเชง เชฎเชพเชเซ - เชเชเชฒเซ เชเซ, เช เชฎเซ เชเซเชเชฒเชพเช เชจเชฎเซเชจเชพเชฎเชพเชเชฅเซ เชเช เชเซเชเชกเซ เชฒเชเช เชเซเช, เชคเซเชจเซ เชตเชงเชพเชฐเชพเชจเซ เชถเชฐเชคเซ เชฆเซเชตเชพเชฐเชพ เชซเชฟเชฒเซเชเชฐ เชเชฐเซเช เชเซเช, เชชเชฐเชฟเชฃเชพเชฎ เชฆเซเชฐเซเช เชเซเช, เชชเชเซ เชเชเชณเชจเซ เชญเชพเช (เชเซ เช เชฎเชพเชฐเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช N เชตเชงเชพเชฐเซเชจเซ เชชเซเชฐเชพเชชเซเชค เชฅเชพเชฏ เชเซ), เช เชจเซ เชคเซเชฅเซ เชเซเชฏเชพเช เชธเซเชงเซ เชเชชเชฃเซ เชธเซเชเซเชฐเซเชจ เชญเชฐเซเช เชจเชนเซเช.
เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ, เชชเชเชกเชพเชฏเซเชฒเชพ เชจเชฎเซเชจเชพเชฎเชพเช N เชฒเชเชญเช 17K เชจเชพ เชฎเซเชฒเซเชฏเซ เชชเชฐ เชชเชนเซเชเชเซ เชเชฏเชพ, เช เชจเซ เชฎเชพเชคเซเชฐ เชเช เช เชฆเชฟเชตเชธเชฎเชพเช เชเชเชพเชฎเชพเช เชเชเซ 4K เชเชตเซ เชตเชฟเชจเชเชคเซเช "เชธเชพเชเชเชณ เชธเชพเชฅเซ" เชเชฒเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชนเชคเซ. เชคเซเชฎเชพเชเชฅเซ เชเซเชฒเซเชฒเชพเชจเซ เชนเชฟเชเชฎเชคเชญเซเชฐ เชธเซเชเซเชจ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเชพ เชนเชคเชพ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชจ เชฆเซเช 1GB เชฎเซเชฎเชฐเซ...
เชเซเชฒ
เชธเซเชฐเซเชธ: www.habr.com