ฟังก์ชัน Substring() ใน SQL Server: วิธีใช้งานพร้อมตัวอย่าง

⚡ สรุปอย่างชาญฉลาด

ฟังก์ชัน SUBSTRING() ใน SQL Server ตัวอย่างเช่นtracts คือส่วนหนึ่งของอักขระ ข้อความ หรือนิพจน์ไบนารี โดยจะส่งคืนอักขระจำนวนหนึ่งจากตำแหน่งเริ่มต้นที่เลือก และเข้ากันได้ดีกับ CHARINDEX สำหรับการแยกวิเคราะห์ตามตัวคั่น

  • 🇧🇷 วัตถุประสงค์: ฟังก์ชัน SUBSTRING() จะส่งคืนส่วนเฉพาะของสตริง โดยพิจารณาจากนิพจน์ต้นทาง ตำแหน่งเริ่มต้น และความยาว
  • 🔢 สามข้อโต้แย้ง: นิพจน์ ตำแหน่งเริ่มต้น และความยาวทั้งหมด เป็นค่าที่จำเป็นทั้งหมดในฟังก์ชัน SUBSTRING() ของ SQL Server
  • 📍 ดัชนีฐานหนึ่ง: ตำแหน่งเริ่มต้นนับจาก 1 ดังนั้นอักขระตัวแรกจึงนับเป็นตำแหน่งที่หนึ่ง ซึ่งจะช่วยหลีกเลี่ยงข้อผิดพลาดที่เกิดจากการคลาดเคลื่อนไปหนึ่งตำแหน่ง
  • 🔎 ด้วย CHARINDEX: การใช้ SUBSTRING() ร่วมกับ CHARINDEX() จะค้นหาตัวคั่นและส่วนขยายtracข้อความก่อนหน้าหรือหลังจากนั้น
  • ↔️ เทียบกับ ซ้ายและขวา: แตกต่างจาก LEFT() และ RIGHT() ฟังก์ชัน SUBSTRING() ตัวอย่างเช่นtracตัวอักษร ts จากตำแหน่งใดก็ได้ ไม่ใช่เฉพาะที่ปลายทั้งสองข้างเท่านั้น
  • ⚠️ กรณีขอบ: ความยาวที่เป็นค่า NULL จะส่งคืนค่า NULL ในขณะที่ความยาวที่เกินกว่าสตริงจะส่งคืนส่วนที่เหลือโดยไม่แสดงข้อผิดพลาด

ฟังก์ชัน SUBSTRING() ใน SQL Server พร้อมตัวอย่าง T-SQL

สตริงย่อย () คืออะไร?

SUBSTRING() เป็นฟังก์ชันใน SQL ซึ่งช่วยให้ผู้ใช้สามารถสร้างสตริงย่อยจากสตริงที่กำหนดได้ตามต้องการ ตัวอย่างเช่น SUBSTRING()tracฟังก์ชัน `SUBSTRING()` ใน SQL ใช้สำหรับดึงสตริงที่มีความยาวตามที่กำหนด โดยเริ่มต้นจากตำแหน่งที่ระบุในสตริงอินพุต จุดประสงค์ของฟังก์ชัน `SUBSTRING()` ใน SQL คือการดึงส่วนเฉพาะของสตริงออกมา

ไวยากรณ์สำหรับสตริงย่อย ()

SUBSTRING(Expression, Starting Position, Total Length)

ที่นี่:

  • นิพจน์ SUBSTRING() ใน SQL Server สามารถเป็นอักขระใดๆ ก็ได้ ไม่ว่าจะเป็นเลขฐานสอง ข้อความ หรือรูปภาพ นิพจน์คือสตริงต้นฉบับที่จะดึงสตริงย่อยออกมา
  • ตำแหน่งเริ่มต้นจะกำหนดตำแหน่งในนิพจน์ที่สตริงย่อยใหม่ควรเริ่มต้น
  • ความยาวทั้งหมด คือความยาวที่คาดหวังทั้งหมดของสตริงย่อยที่ได้จากนิพจน์ โดยเริ่มจากตำแหน่งเริ่มต้น

กฎการใช้ SUBSTRING()

  • ฟังก์ชัน SUBSTRING() ของ MS SQL ต้องระบุอาร์กิวเมนต์ทั้งสามตัว
  • หากตำแหน่งเริ่มต้นมากกว่าจำนวนอักขระสูงสุดในนิพจน์ ฟังก์ชัน SUBSTRING() ใน SQL Server จะไม่ส่งค่าใดๆ กลับมา
  • ความยาวรวมอาจเกินความยาวอักขระสูงสุดของสตริงเดิม ในกรณีนี้ สตริงย่อยที่ได้จะเป็นสตริงทั้งหมด โดยเริ่มจากตำแหน่งเริ่มต้นในนิพจน์จนถึงอักขระสุดท้ายของนิพจน์

แผนภาพด้านล่างแสดงการใช้งานฟังก์ชัน SUBSTRING() ใน SQL Server:

แผนภาพแสดงวิธีการทำงานของฟังก์ชัน SUBSTRING()tracอักขระ ts จากตำแหน่งเริ่มต้นสำหรับความยาวที่กำหนด

ตัวอย่างสตริงย่อย T-SQL

ข้อสมมติฐาน: สมมติว่าเรามีตารางชื่อ 'Guruตาราง 99 ที่มีสองคอลัมน์และสี่แถว ดังแสดงด้านล่าง เราจะใช้ตารางนี้ 'Guruตาราง 99 ในตัวอย่างต่อไปนี้:

Guruตารางตัวอย่างที่ 99 ที่มีคอลัมน์ Tutorial_ID และ Tutorial_name ซึ่งใช้ในตัวอย่าง SUBSTRING

คำถามที่ 1: การใช้ฟังก์ชัน SUBSTRING() ใน SQL กับความยาวที่น้อยกว่าความยาวสูงสุดทั้งหมดของนิพจน์

SELECT Tutorial_name, SUBSTRING(Tutorial_name,1,2) As SUB from Guru99;

ผลลัพธ์: แผนภาพด้านล่างแสดงสตริงย่อยของคอลัมน์ 'Tutorial_name' เป็นคอลัมน์ 'SUB' โดยตำแหน่งเริ่มต้นคือ 1 และความยาวคือ 2 ดังนั้นจึงส่งคืนอักขระสองตัวแรก:

ตารางผลลัพธ์จะแสดงอักขระสองตัวแรกของ Tutorial_name ในคอลัมน์ SUB

คำถามที่ 2: การใช้ฟังก์ชัน SUBSTRING() ใน SQL Server กับความยาวที่มากกว่าความยาวสูงสุดทั้งหมดของนิพจน์

SELECT Tutorial_name, SUBSTRING(Tutorial_name,2,8) As SUB from Guru99;

ผลลัพธ์: แผนภาพด้านล่างแสดงสตริงย่อยของคอลัมน์ 'Tutorial_name' เป็นคอลัมน์ 'SUB' แม้ว่าความยาวของสตริงย่อยจะมากกว่าความยาวสูงสุดทั้งหมดของนิพจน์ แต่ก็ไม่มีข้อผิดพลาดเกิดขึ้น และแบบสอบถามจะส่งคืนสตริงเต็มตั้งแต่ตำแหน่งเริ่มต้นเป็นต้นไป:

ตารางแสดงผลลัพธ์ที่แสดงส่วนที่เหลือของ Tutorial_name เมื่อความยาวที่ร้องขอเกินกว่าสตริงที่กำหนด

ฟังก์ชัน SUBSTRING ร่วมกับ CHARINDEX ใน SQL Server

การใช้งาน SUBSTRING() ในโลกแห่งความเป็นจริงที่พบได้บ่อยมากอย่างหนึ่งคือการยกตัวอย่างtracข้อความที่อยู่ก่อนหรือหลังตัวคั่น เช่น โดเมนในที่อยู่อีเมล โดยปกติแล้ว ฟังก์ชัน SUBSTRING() ต้องการตำแหน่งเริ่มต้นที่แน่นอน แต่ตำแหน่งของตัวคั่นจะแตกต่างกันไปในแต่ละแถว ฟังก์ชัน CHARINDEX() แก้ปัญหานี้ได้โดยการส่งคืนตำแหน่งของอักขระภายในสตริง:

CHARINDEX(substring_to_find, expression [, start_location])

การใช้ CHARINDEX() ซ้อนอยู่ภายใน SUBSTRING() ทำให้ตำแหน่งเริ่มต้นเปลี่ยนแปลงได้ ตัวอย่างด้านล่างจะค้นหา... @ สัญลักษณ์และส่งคืนทุกอย่างที่อยู่หลังจากนั้น A ตัวแปร เก็บค่าตัวอย่างไว้:

DECLARE @Email VARCHAR(50) = 'john.doe@guru99.com';
SELECT SUBSTRING(@Email, CHARINDEX('@', @Email) + 1, LEN(@Email)) AS Domain;

ในที่นี้ CHARINDEX('@', @Email) จะค้นหาตำแหน่งของสัญลักษณ์ @ การเพิ่ม 1 จะเลื่อนเลยไป และจากนั้น SUBSTRING() จะแสดงผลtracts คืออักขระที่เหลือ สำหรับค่าข้างต้น การค้นหาจะส่งคืนโดเมน guru99.comรูปแบบ CHARINDEX-plus-SUBSTRING นี้เป็นวิธีการมาตรฐานในการแยกวิเคราะห์สตริงที่มีโครงสร้างใน T-SQL

SUBSTRING เทียบกับ LEFT และ RIGHT ใน SQL Server

SQL Server ยังมีฟังก์ชัน LEFT() และ RIGHT() สำหรับดึงอักขระจากต้นหรือท้ายสตริง ฟังก์ชันเหล่านี้เขียนได้สั้นกว่า แต่จำกัดเฉพาะปลายทั้งสองด้านเท่านั้น ฟังก์ชัน SUBSTRING() มีความยืดหยุ่นมากที่สุดเพราะสามารถเริ่มต้นที่ตำแหน่งใดก็ได้ ตารางด้านล่างเปรียบเทียบฟังก์ชันทั้งสอง:

ฟังก์ชัน ข้อโต้แย้ง Extracts จาก เทียบเท่ากับ SUBSTRING()
LEFT(expression, n) 2 จุดเริ่มต้นของสตริง SUBSTRING(expression, 1, n)
ถูกต้อง(นิพจน์, n) 2 สิ้นสุดสตริง SUBSTRING(expression, LEN(expression) – n + 1, n)
SUBSTRING(expression, start, length) 3 ตำแหน่งใดก็ได้ ไม่สามารถใช้งาน

โดยสรุปแล้ว ฟังก์ชัน LEFT() และ RIGHT() เป็นทางลัดที่สะดวกสำหรับการดึงข้อมูลจากส่วนปลายของสตริง ในขณะที่ฟังก์ชัน SUBSTRING() จะจัดการกรณีทั่วไป รวมถึงอักขระที่ดึงมาจากตรงกลางด้วย

อาร์กิวเมนต์ที่เป็นค่าลบ ศูนย์ และ NULL ในฟังก์ชัน SUBSTRING

นอกเหนือจากกฎพื้นฐานแล้ว การเข้าใจพฤติกรรมของ SUBSTRING() ที่ขอบก็เป็นประโยชน์เช่นกัน เมื่อตำแหน่งเริ่มต้นเป็นศูนย์หรือติดลบ SQL Server จะคำนวณความยาวที่มีประสิทธิภาพเป็น (start + length – 1) และเริ่มอ่านจากตำแหน่งที่หนึ่ง เมื่ออาร์กิวเมนต์ใด ๆ เป็น NULL ผลลัพธ์จะเป็น NULL ตารางด้านล่างนี้ได้รับการตรวจสอบกับข้อมูลอย่างเป็นทางการแล้ว การตัดสตริง (Transact-SQL) เอกสารอ้างอิงนี้แสดงกรณีต่างๆ ดังนี้:

โทร ผล เหตุผล
ซับสตริง('Guru99', 1, 4) Guru การเรียกแบบปกติ: อักขระสี่ตัวจากตำแหน่งที่หนึ่ง
ซับสตริง('Guru99', 0, 3) Gu เริ่มต้นจากด้านล่างหนึ่ง: ความยาวที่มีประสิทธิภาพคือ 0 + 3 – 1 = 2
ซับสตริง('Guru99', 4, 100) u99 ความยาวที่เกินสตริงจะคืนค่าส่วนที่เหลือโดยไม่มีข้อผิดพลาด
ซับสตริง('Guru99', 3, NULL) NULL อาร์กิวเมนต์ที่เป็นค่า NULL จะทำให้ผลลัพธ์ทั้งหมดเป็น NULL เช่นกัน

การทราบกรณีพิเศษเหล่านี้จะช่วยป้องกันความประหลาดใจเมื่อคำนวณตำแหน่งเริ่มต้นจากคอลัมน์อื่นหรือ ตัวแปร ซึ่งอาจเป็นศูนย์หรือค่าว่าง (NULL)

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

SQL Server ใช้ฟังก์ชัน SUBSTRING(); โดยชื่อที่ใช้ในฟังก์ชันนี้คือ SUBSTR() Oracle และ MySQLทั้งสองฟังก์ชันส่งคืนส่วนหนึ่งของสตริง แต่ SUBSTRING() เป็นฟังก์ชันมาตรฐานของ Transact-SQL ดังนั้น SUBSTR() จะไม่สามารถทำงานบน SQL Server ได้

ใช่แล้ว เนื่องจากฟังก์ชัน SUBSTRING() ส่งคืนค่า จึงสามารถปรากฏในส่วน WHERE, SELECT และ ORDER BY ได้ การกรองด้วย SUBSTRING() มักจะป้องกันการค้นหาดัชนี ดังนั้นรูปแบบ LIKE จึงมักจะเร็วกว่าสำหรับการค้นหาแบบใช้คำนำหน้า

ใช่ แต่ SQL Server จะแปลงค่าเป็นสตริงก่อน ไม่ว่าจะโดยปริยายหรือผ่านคำสั่ง CAST หรือ CONVERT ตำแหน่งเริ่มต้นและความยาวจะนับจำนวนอักขระ ไม่ใช่ตัวเลขหรือส่วนของวันที่ ดังนั้นควรจัดรูปแบบค่าอย่างระมัดระวัง

รูปแบบที่มีอาร์กิวเมนต์สามตัวทำงานคล้ายกัน แต่รายละเอียดแตกต่างกัน MySQL นอกจากนี้ยังอนุญาตให้ใช้ SUBSTR() และตำแหน่งเริ่มต้นที่เป็นค่าลบได้ ในขณะที่ SQL Server ใช้ SUBSTRING() และจัดการตำแหน่งเริ่มต้นที่ต่ำกว่าหนึ่งโดยใช้กฎความยาวที่มีประสิทธิภาพ

ฟังก์ชัน SUBSTRING() จะส่งคืนค่าประเภทเดียวกับอินพุต: varchar สำหรับข้อมูลอักขระ, nvarchar สำหรับข้อความ Unicode และ varbinary สำหรับนิพจน์ไบนารี ความยาวขึ้นอยู่กับสตริงย่อยที่ต้องการ ไม่ใช่คอลัมน์ทั้งหมดของแหล่งข้อมูล

ห่อping การใช้คอลัมน์ในฟังก์ชัน SUBSTRING() ภายในเงื่อนไข WHERE ทำให้เงื่อนไขนั้นไม่สามารถใช้การค้นหาด้วยดัชนีได้ ดังนั้น SQL Server จึงไม่สามารถใช้การค้นหาด้วยดัชนีกับคอลัมน์นั้นได้ สำหรับการจับคู่แบบคำนำหน้า รูปแบบ LIKE 'value%' มักจะทำงานได้ดีกว่า

ใช่. นักบิน GitHub สามารถสร้างนิพจน์ SUBSTRING() และ CHARINDEX() รวมถึงการแยกวิเคราะห์ตามตัวคั่น จากข้อความแจ้งที่เป็นภาษาธรรมชาติได้ โปรดตรวจสอบตำแหน่งเริ่มต้น ความยาว และการจัดทำดัชนีแบบ 1-based ก่อนเรียกใช้คำสั่งค้นหาเสมอ

ปัญญาประดิษฐ์ (AI) และผู้ช่วยการเรียนรู้ของเครื่องจะแปลงกฎภาษาอังกฤษธรรมดาให้เป็นชุดค่าผสมของฟังก์ชัน SUBSTRING(), CHARINDEX(), LEFT() และ RIGHT() พร้อมทั้งแนะนำการคำนวณความยาว และแจ้งเตือนข้อผิดพลาดที่คลาดเคลื่อนไปหนึ่งตำแหน่ง นักพัฒนาจะตรวจสอบความถูกต้องของแต่ละข้อเสนอแนะก่อนนำไปใช้งาน

สรุปโพสต์นี้ด้วย: