0Pricing
SQL Interview Prep · บทเรียน

การแยกวิเคราะห์และจัดรูปแบบสตริง

เรียนรู้ SUBSTRING ตำแหน่ง การแยกข้อความ และการเปลี่ยนตัวพิมพ์ในแต่ละภาษาถิ่น

การแยกวิเคราะห์และจัดรูปแบบสตริง เป็นบทเรียน SQL Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงมีการถามเรื่องฟังก์ชันจัดการข้อความ

ข้อมูลจริงมักไม่เป็นระเบียบ เช่น ชื่อเต็มที่ต้องแยกส่วน โดเมนอีเมลที่ต้องดึงออกมา รหัสที่ฝังอยู่ในรหัสประจำตัว และตัวพิมพ์ที่ไม่สม่ำเสมอ ผู้สัมภาษณ์ใช้การจัดการข้อความเพื่อดูว่าคุณสามารถทำความสะอาดและปรับรูปแบบข้อความได้หรือไม่ โดยไม่ต้องส่งข้อมูลออกไปประมวลผลด้วยสคริปต์

เช่นเดียวกับวันที่ ฟังก์ชันเหล่านี้มีมาตรฐานร่วมกันเพียงบางส่วน ดังนั้นเป้าหมายคือการเข้าใจ แนวคิด และรูปแบบที่ใช้กันทั่วไป

  • การดึงข้อความบางส่วนและการค้นหาตำแหน่ง
  • การต่อข้อความ
  • การแยกและการแทนที่ข้อความ
  • การแปลงตัวพิมพ์และการตัดช่องว่าง

SUBSTRING และตำแหน่ง

SUBSTRING(s FROM start FOR length) เป็นรูปแบบตามมาตรฐาน SQL ส่วนระบบส่วนใหญ่รองรับ SUBSTRING(s, start, length) ด้วย ตำแหน่งในข้อความเริ่มนับจาก 1 ซึ่งเป็นกับดักการเหลื่อมหนึ่งตำแหน่งแบบคลาสสิกสำหรับนักเขียนโปรแกรมที่คุ้นเคยกับภาษาซึ่งเริ่มนับจาก 0

POSITION(sub IN s) (หรือ STRPOS/CHARINDEX) ค้นหาตำแหน่งที่ข้อความย่อยเริ่มต้น และคืนค่า 0 เมื่อไม่พบ

SELECT
  SUBSTRING('INV-2024-042' FROM 5 FOR 4) AS year,   -- '2024'
  POSITION('-' IN 'INV-2024-042')        AS first_dash; -- 4

การดึงโดเมนอีเมล

นี่คือตัวอย่างมาตรฐานที่ใช้สาธิตการทำงาน ค้นหา @ แล้วดึงทุกอย่างที่อยู่หลังสัญลักษณ์นั้นออกมา การใช้ POSITION ร่วมกับ SUBSTRING เป็นวิธีที่ใช้ได้กับหลายระบบ

ใน PostgreSQL คุณยังสามารถใช้ SPLIT_PART(email, '@', 2) ได้ด้วย ซึ่งอ่านเข้าใจง่ายกว่าและควรกล่าวถึงในฐานะคำตอบตามรูปแบบที่เหมาะสม

-- Portable
SELECT SUBSTRING(email FROM POSITION('@' IN email) + 1) AS domain
FROM users;

-- Postgres idiom
SELECT SPLIT_PART(email, '@', 2) AS domain FROM users;

การต่อข้อความในรูปแบบ SQL ต่าง ๆ

การต่อข้อความขึ้นอยู่กับรูปแบบ SQL และผู้สัมภาษณ์คาดหวังให้คุณรู้จักรูปแบบต่าง ๆ

  • มาตรฐาน SQL / PostgreSQL / Oracle: ใช้ตัวดำเนินการ ||
  • MySQL: ใช้ CONCAT(a, b, c) (โดยค่าเริ่มต้น ตัวดำเนินการ || คือ OR เชิงตรรกะ)
  • SQL Server: ใช้ + สำหรับข้อความ หรือใช้ CONCAT()

CONCAT() จะถือว่า NULL เป็นข้อความว่าง ขณะที่โดยทั่วไป || และ + จะทำให้ผลลัพธ์ทั้งหมดเป็น NULL หากตัวถูกดำเนินการใด ๆ เป็น NULL ซึ่งเป็นแหล่งที่มาของข้อผิดพลาดที่สังเกตได้ยาก

-- Postgres
SELECT first_name || ' ' || last_name AS full_name FROM people;

-- MySQL / SQL Server
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM people;

กับดักค่า NULL ในการต่อข้อความ

ต่อเนื่องจากตัวอย่างก่อนหน้า หาก last_name เป็น NULL ผลลัพธ์ของ first_name || ' ' || last_name ใน PostgreSQL จะเป็น NULL ทำให้ชื่อทั้งหมดหายไป

วิธีแก้เพื่อป้องกันคือใช้ COALESCE กับส่วนที่อาจเป็น NULL หรือใช้ CONCAT_WS (การต่อข้อความพร้อมตัวคั่น) ซึ่งจะข้ามค่า NULL และใส่ตัวคั่นเฉพาะระหว่างค่าที่มีอยู่เท่านั้น

-- Safe in Postgres / MySQL
SELECT CONCAT_WS(' ', first_name, last_name) AS full_name FROM people;

-- Or guard each part
SELECT first_name || ' ' || COALESCE(last_name, '') FROM people;

การแยกข้อความ

โจทย์ "ดึงส่วนที่สามจากรหัสที่คั่นด้วยขีดกลาง" เป็นการทดสอบการแยกข้อความ SPLIT_PART(s, delim, n) ของ PostgreSQL จะคืนส่วนที่ n โดยตรงและเป็นเครื่องมือที่สะอาดที่สุดสำหรับงานนี้

MySQL ไม่มีฟังก์ชันแยกข้อความโดยตรง รูปแบบที่ใช้คือซ้อน SUBSTRING_INDEX โดยดึง n ส่วนแรกก่อน แล้วจึงเลือกส่วนสุดท้ายจากกลุ่มนั้น

-- Postgres
SELECT SPLIT_PART('a-b-c-d', '-', 3); -- 'c'

-- MySQL: third part of a-b-c-d
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('a-b-c-d', '-', 3), '-', -1); -- 'c'

การแทนที่ การตัดช่องว่าง และการเติมอักขระ

การดำเนินการทำความสะอาดข้อมูลที่ผู้สัมภาษณ์คาดหวังให้รู้ทันที:

  • REPLACE(s, from, to) แทนที่ทุกตำแหน่งที่พบ
  • TRIM(s) ลบช่องว่างด้านหน้าและด้านท้าย ส่วน TRIM(BOTH 'x' FROM s) ลบอักขระที่ระบุ
  • LPAD(s, len, ch) / RPAD เติมข้อความให้มีความกว้างคงที่ ซึ่งเหมาะสำหรับการเติมศูนย์ให้รหัส
SELECT
  REPLACE('555.123.4567', '.', '-') AS phone,   -- 555-123-4567
  TRIM('   hello   ')               AS clean,   -- 'hello'
  LPAD('42', 6, '0')                AS padded;   -- '000042'

การแปลงตัวพิมพ์และความยาว

การทำให้ตัวพิมพ์เป็นรูปแบบเดียวกันเป็นสิ่งจำเป็นก่อนเปรียบเทียบหรือจัดกลุ่มข้อความ UPPER และ LOWER ใช้ได้ทั่วไป ส่วน INITCAP (PostgreSQL/Oracle) จะเปลี่ยนคำให้ขึ้นต้นด้วยตัวพิมพ์ใหญ่

LENGTH(s) จะคืนจำนวนอักขระในระบบส่วนใหญ่ แต่ควรระวังว่า SQL Server ใช้ LEN() และในการตั้งค่าบางแบบ LENGTH จะนับจำนวนไบต์สำหรับข้อความหลายไบต์ ควรกล่าวถึงรายละเอียดนี้เมื่อทำงานกับข้อมูลที่ไม่ใช่ ASCII

SELECT
  LOWER(email)        AS email_norm,
  INITCAP(city)       AS city_pretty,  -- Postgres
  LENGTH(description)  AS chars
FROM places;

การจับคู่รูปแบบที่เหนือกว่า LIKE

เมื่อ LIKE ไม่ทรงพลังเพียงพอ ผู้สัมภาษณ์มักอยากเห็นว่าคุณเข้าใจนิพจน์ทั่วไป PostgreSQL มีตัวดำเนินการ ~ และ REGEXP_REPLACE / REGEXP_MATCHES ส่วน MySQL มี REGEXP / REGEXP_SUBSTR

ตัวอย่างเช่น การเก็บเฉพาะตัวเลขจากข้อความหมายเลขโทรศัพท์ นิพจน์ทั่วไปทำให้เขียนเป็นคำสั่งบรรทัดเดียวได้ แทนที่จะต้องเรียก REPLACE ต่อกันหลายครั้ง

-- Postgres: strip non-digits
SELECT REGEXP_REPLACE('(555) 123-4567', '[^0-9]', '', 'g')
  AS digits; -- '5551234567'

ตัวอย่างเชิงลึก: การทำชื่อให้เป็นรูปแบบมาตรฐานและการลบข้อมูลซ้ำ

นี่คืองานทำความสะอาดข้อมูลหลายขั้นตอน สมมติว่าชื่อที่เข้ามามีช่องว่างเกินและตัวพิมพ์ปะปนกันจนทำให้เกิดรายการซ้ำโดยผิดพลาด ให้ทำข้อมูลเป็นรูปแบบมาตรฐานก่อน แล้วจึงจัดกลุ่ม

ตัดช่องว่าง รวมช่องว่างภายในด้วยนิพจน์ทั่วไป และเปลี่ยนเป็นตัวพิมพ์เล็กก่อนนับค่าที่แตกต่างกัน นี่คือการใช้เหตุผลหลายขั้นตอนแบบที่ผู้สัมภาษณ์ให้ความสำคัญ

SELECT
  LOWER(REGEXP_REPLACE(TRIM(name), '\s+', ' ', 'g')) AS norm_name,
  COUNT(*) AS occurrences
FROM contacts
GROUP BY 1
ORDER BY occurrences DESC;

การแปลงข้อความเป็นตัวเลขและวันที่

คอลัมน์ข้อความมักเก็บค่าที่ควรเป็นตัวเลขหรือวันที่ CAST(s AS INTEGER) หรือรูปแบบย่อของ PostgreSQL อย่าง s::int ใช้แปลงค่าได้ แต่จะล้มเหลวเมื่อข้อมูลขาเข้าไม่ถูกต้อง

สำหรับวันที่ TO_DATE(s, 'YYYY-MM-DD') (PostgreSQL/Oracle) จะแปลงข้อความโดยใช้รูปแบบที่ระบุอย่างชัดเจน ซึ่งเป็นวิธีที่ปลอดภัยที่สุดเพราะขจัดความกำกวมเรื่องลำดับวันและเดือน

SELECT
  CAST(qty_text AS INTEGER)            AS qty,
  TO_DATE(order_str, 'DD/MM/YYYY')     AS order_date
FROM staging;

ตรวจสอบอย่างรวดเร็ว

วิเคราะห์พฤติกรรมของค่า NULL ในการต่อข้อความ

สรุป: การแยกวิเคราะห์และการจัดรูปแบบข้อความ

ประเด็นสำคัญที่ควรนำไปใช้ในการสัมภาษณ์:

  • ตำแหน่งในข้อความเริ่มนับจาก 1 ใช้ SUBSTRING ร่วมกับ POSITION เพื่อดึงข้อความตามตำแหน่ง
  • ต่อข้อความด้วย || (PostgreSQL), CONCAT (MySQL) หรือ + (SQL Server) และอย่าลืมเรื่องการส่งต่อค่า NULL โดยควรเลือกใช้ CONCAT_WS
  • แยกข้อความด้วย SPLIT_PART (PostgreSQL) หรือ SUBSTRING_INDEX ที่ซ้อนกัน (MySQL)
  • REPLACE, TRIM, LPAD, UPPER/LOWER ใช้ทำความสะอาดและทำให้ข้อมูลเป็นรูปแบบมาตรฐาน ส่วนนิพจน์ทั่วไปใช้จัดการกรณีที่ซับซ้อน
  • ทำให้ตัวพิมพ์และช่องว่างเป็นรูปแบบมาตรฐานก่อนจัดกลุ่ม เพื่อหลีกเลี่ยงรายการซ้ำโดยผิดพลาด

คำถามที่พบบ่อย

บทเรียน “การแยกวิเคราะห์และจัดรูปแบบสตริง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การแยกวิเคราะห์และจัดรูปแบบสตริง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การแยกวิเคราะห์และจัดรูปแบบสตริง”

เรียนรู้ SUBSTRING ตำแหน่ง การแยกข้อความ และการเปลี่ยนตัวพิมพ์ในแต่ละภาษาถิ่น คุณปฏิบัติ SQL Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Interview Prep หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การแยกวิเคราะห์และจัดรูปแบบสตริง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน SQL Interview Prep นี้ได้ไหม

ได้ บทเรียน SQL Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การคำนวณวันที่และช่วงเวลา
  2. การตัดและจัดกลุ่มวันที่
  3. การแยกวิเคราะห์และจัดรูปแบบสตริง
  4. เขตเวลาและประทับเวลา
← กลับไปที่ SQL Interview Prep