ฟังก์ชัน Transact-SQL ฟังก์ชันในตัว ฟังก์ชันสตริงใน sql

ให้กับผู้อื่น มีไวยากรณ์ดังต่อไปนี้:

CONV(หมายเลข,N,M)

การโต้แย้ง ตัวเลขอยู่ในฐาน N ฟังก์ชันจะแปลงเป็นฐาน M และส่งกลับค่าเป็นสตริง

ตัวอย่างที่ 1

แบบสอบถามต่อไปนี้แปลงตัวเลข 2 จากทศนิยมเป็นไบนารี:

เลือกคอนวี(2,10,2);

ผลลัพธ์: 10

ในการแปลงตัวเลข 2E จากเลขฐานสิบหกเป็นทศนิยม จำเป็นต้องมีแบบสอบถามต่อไปนี้:

เลือก CONV("2E",16,10);

ผลลัพธ์: 46

การทำงาน ถ่าน()แปลงรหัส ASCII เป็นสตริง มีไวยากรณ์ดังต่อไปนี้:

ถ่าน(n1,n2,n3..)

ตัวอย่างที่ 2

เลือกถ่าน(83,81,76);

ผลลัพธ์: SQL

ฟังก์ชันต่อไปนี้ส่งคืนความยาวของสตริง:

  • ความยาว (สตริง);
  • OCTET_LENGTH(สตริง);
  • CHAR_LENGTH(สตริง);
  • CHARACTER_LENGTH(สตริง)

ตัวอย่างที่ 3

เลือกความยาว("MySQL");

ผลลัพธ์: 5

บางครั้งฟังก์ชันนี้ก็มีประโยชน์ BIT_LENGTH(สตริง)ซึ่งส่งคืนความยาวของสตริงเป็นบิต

ตัวอย่างที่ 4

SELECT BIT_LENGTH("MySQL");

ผลลัพธ์: 40

ฟังก์ชั่นสำหรับการทำงานกับสตริงย่อย

สตริงย่อยมักจะเป็นส่วนหนึ่งของสตริง บ่อยครั้งที่คุณจำเป็นต้องทราบตำแหน่งของสตริงย่อยที่เกิดขึ้นครั้งแรกในสตริง ฟังก์ชั่นสามอย่างช่วยแก้ปัญหานี้ใน MySQL:

  • LOCATE(สตริงย่อย, สตริง [,ตำแหน่ง]);
  • ตำแหน่ง (สตริงย่อย, สตริง);
  • INSTR(สตริง, สตริงย่อย)

ถ้าสตริงย่อยไม่มีอยู่ในสตริง ฟังก์ชันทั้งสามฟังก์ชันจะส่งคืนค่า 0 ฟังก์ชัน INSTR() แตกต่างจากอีกสองฟังก์ชันตามลำดับอาร์กิวเมนต์ ฟังก์ชัน LOCATE() สามารถมีอาร์กิวเมนต์ที่สามได้ ตำแหน่งซึ่งช่วยให้คุณสามารถค้นหาสตริงย่อยในสตริงที่ไม่ได้มาจากจุดเริ่มต้น แต่จากตำแหน่งที่ระบุ

ตัวอย่างที่ 5

SELECT LOCATE("Topaz", "บริษัทร่วมทุนเปิด Topaz");

ผลลัพธ์: 31

เลือกตำแหน่ง("Topaz", "บริษัทร่วมหุ้นเปิด Topaz");

ผลลัพธ์: 31

SELECT INSTR("บริษัทร่วมทุนเปิด Topaz",'Topaz');

ผลลัพธ์: 31

เลือกตำแหน่ง ("Topaz", "โรงงาน Topaz และ Topaz LLC", 9);

ผลลัพธ์: 20

SELECT LOCATE("Almaz", "Topaz Open Joint Stock Company");

ผลลัพธ์: 0

ฟังก์ชั่น ซ้าย(เส้น, N)และ ขวา(สตริง, N)ส่งคืนอักขระ N ซ้ายสุดและขวาสุดในสตริงตามลำดับ

ตัวอย่างที่ 6

เลือกซ้าย("MySQL DBMS", 4);

ผลลัพธ์: DBMS

เลือกขวา("MySQL DBMS", 5);

ผลลัพธ์: MySQL

บางครั้งคุณจำเป็นต้องได้สตริงย่อยที่เริ่มต้นที่ตำแหน่งที่กำหนด ฟังก์ชั่นต่อไปนี้ใช้สำหรับสิ่งนี้:

  • SUBSTRING(สตริง, ตำแหน่ง, N);
  • MID(เส้น, ตำแหน่ง, N)

ฟังก์ชันทั้งสองส่งคืนอักขระ N ตัวของสตริงที่กำหนด โดยเริ่มต้นที่ตำแหน่งที่ระบุ

ตัวอย่างที่ 7

SELECT SUBSTRING("MySQL DBMS เป็นหนึ่งใน DBMS ที่ได้รับความนิยมมากที่สุด", 6.5);

ผลลัพธ์: MySQL

คุณลักษณะนี้มีประโยชน์มากเมื่อทำงานกับที่อยู่อีเมลและที่อยู่เว็บไซต์ SUBSTR_INDEX()- ฟังก์ชันมีสามอาร์กิวเมนต์:

SUBSTR_INDEX(สตริง, ตัวคั่น, N)

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

ตัวอย่างที่ 8

เลือก SUBSTRING_INDEX("www.mysql.ru",".,2);

ผลลัพธ์: www.mysql

เลือก SUBSTRING_INDEX("www.mysql.ru","",-2);

ผลลัพธ์: mysql.ru

การทำงาน แทนที่(สตริง, สตริงย่อย1, สตริงย่อย2)อนุญาตให้คุณแทนที่รายการทั้งหมดของ substring1 ด้วย substring2 ในสตริง

ฟังก์ชันสตริง SQL

ฟังก์ชันกลุ่มนี้ช่วยให้คุณจัดการข้อความได้ มีฟังก์ชันสตริงมากมาย เราจะมาดูฟังก์ชันที่พบบ่อยที่สุดกัน
  • CONCAT(str1,str2...) ส่งกลับสตริงที่สร้างขึ้นโดยการเชื่อมอาร์กิวเมนต์เข้าด้วยกัน (อาร์กิวเมนต์อยู่ในวงเล็บ - str1,str2...) ตัวอย่างเช่น ในตารางผู้ขายของเราจะมีคอลัมน์เมืองและคอลัมน์ที่อยู่

    สมมติว่าเราต้องการให้ตารางผลลัพธ์มีที่อยู่และเมืองอยู่ในคอลัมน์เดียวกัน เช่น เราต้องการรวมข้อมูลจากสองคอลัมน์เป็นหนึ่งเดียว ในการดำเนินการนี้ เราจะใช้ฟังก์ชันสตริง CONCAT() และเราจะระบุชื่อของคอลัมน์ที่จะรวมกันเป็นอาร์กิวเมนต์ - เมืองและที่อยู่:


    เลือก CONCAT (เมือง ที่อยู่) จากผู้ขาย

    โปรดทราบว่าการรวมเกิดขึ้นโดยไม่มีการแยกซึ่งไม่สามารถอ่านได้มากนัก มาปรับแบบสอบถามของเราเพื่อให้มีช่องว่างระหว่างคอลัมน์ที่จะเข้าร่วม:


    เลือก CONCAT(เมือง, " ", ที่อยู่) จากผู้ขาย; อย่างที่คุณเห็น การเว้นวรรคก็ถือเป็นอาร์กิวเมนต์เช่นกัน และถูกระบุโดยคั่นด้วยเครื่องหมายจุลภาค หากมีคอลัมน์ที่จะรวมมากขึ้น การระบุช่องว่างในแต่ละครั้งจะไม่มีเหตุผล ในกรณีนี้ เราสามารถใช้ฟังก์ชันสตริงได้ CONCAT_WS(ตัวคั่น str1,str2...)

    ซึ่งวางตัวคั่นระหว่างสตริงที่ต่อกัน (ตัวคั่นถูกระบุเป็นอาร์กิวเมนต์แรก) ข้อความค้นหาของเราจะมีลักษณะดังนี้:

    เลือก CONCAT_WS(" ", เมือง, ที่อยู่) จากผู้ขาย;


  • ผลลัพธ์ไม่ได้เปลี่ยนแปลงจากภายนอก แต่ถ้าเรารวม 3 หรือ 4 คอลัมน์ โค้ดก็จะลดลงอย่างมากส่งกลับสตริง str โดยมีสตริงย่อยเริ่มต้นที่ตำแหน่ง pos และมีความยาวอักขระ len แทนที่ด้วยสตริงย่อย new_str สมมติว่าเราตัดสินใจที่จะไม่แสดงอักขระ 3 ตัวแรกในคอลัมน์ที่อยู่ (ตัวย่อ st., pr., ฯลฯ ) จากนั้นเราจะแทนที่ด้วยช่องว่าง:

    SELECT INSERT(ที่อยู่, 1, 3, " ") จากผู้จำหน่าย;


    นั่นคืออักขระสามตัวโดยเริ่มจากตัวแรกจะถูกแทนที่ด้วยช่องว่างสามช่อง


  • LPAD(str, len, dop_str) ส่งกลับสตริง str เสริมด้านซ้ายด้วย dop_str เท่ากับความยาว len

    สมมติว่าเราต้องการแสดงเมืองของซัพพลายเออร์ทางด้านขวาและเติมจุดว่างในช่องว่าง:



  • เลือก LPAD(city, 15, ".") จากผู้ขาย;

    RPAD(str, len, dop_str) ส่งกลับสตริง str ทางด้านขวาที่เสริมด้วย dop_str ให้เป็นความยาว len


    สมมติว่าเราต้องการแสดงเมืองของซัพพลายเออร์ทางด้านซ้าย และเติมจุดว่างลงในช่องว่าง:


  • เลือก RPAD (เมือง, 15, ".") จากผู้ขาย;

    โปรดทราบว่าค่า len จะจำกัดจำนวนอักขระที่แสดง เช่น หากชื่อเมืองยาวเกิน 15 ตัวอักษร ชื่อเมืองจะถูกตัดทอน


  • LTRIM(str) ส่งกลับสตริง str โดยลบช่องว่างนำหน้าทั้งหมดออก ฟังก์ชันสตริงนี้สะดวกในการแสดงข้อมูลอย่างถูกต้องในกรณีที่อนุญาตให้มีการเว้นวรรคแบบสุ่มเมื่อป้อนข้อมูล:

    เลือก LTRIM (เมือง) จากผู้ขาย

    RTRIM(str) ส่งกลับสตริง str โดยลบช่องว่างต่อท้ายทั้งหมด:


  • เลือก RTRIM (เมือง) จากผู้ขาย

    ในกรณีของเรา ไม่มีการเว้นวรรคเพิ่มเติม ดังนั้นเราจะไม่เห็นผลจากภายนอก


  • TRIM(str) ส่งคืนสตริง str โดยลบช่องว่างนำหน้าและต่อท้ายออกทั้งหมด:

    เลือก TRIM (เมือง) จากผู้ขาย


    LOWER(str) ส่งกลับสตริง str โดยแปลงอักขระทั้งหมดเป็นตัวพิมพ์เล็ก

    มันทำงานไม่ถูกต้องกับตัวอักษรรัสเซีย ดังนั้นจึงเป็นการดีกว่าที่จะไม่ใช้มัน ตัวอย่างเช่น ลองใช้ฟังก์ชันนี้กับคอลัมน์เมือง:



  • เลือกเมือง ล่าง (เมือง) จากผู้ขาย;

    ดูสิว่ามันกลายเป็น gobbledygook แบบไหน แต่ทุกอย่างเรียบร้อยดีด้วยอักษรละติน:



  • เลือกด้านล่าง("เมือง");

    UPPER(str) ส่งกลับสตริง str โดยแปลงอักขระทั้งหมดเป็นตัวพิมพ์ใหญ่



  • เป็นการดีกว่าที่จะไม่ใช้กับตัวอักษรรัสเซีย แต่ทุกอย่างเรียบร้อยดีด้วยอักษรละติน:

    เลือกชื่อ LEFT (เมือง 3) จากผู้ขาย



  • RIGHT(str, len) ส่งกลับอักขระทางขวาของสตริง str ตัวอย่างเช่น ให้แสดงเฉพาะอักขระสามตัวสุดท้ายในเมืองของซัพพลายเออร์: SELECT LOAD_FILE("C:/proverka");
    โปรดทราบว่าคุณต้องระบุเส้นทางที่แน่นอนไปยังไฟล์

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

นี่คือรายการฟังก์ชันสตริงทั้งหมดที่นำมาจาก BOL:

ผลลัพธ์คือ 11 หากต้องการค้นหาว่าตัวอักษรเหล่านี้คืออะไร เราสามารถใช้ฟังก์ชัน CHAR ซึ่งส่งคืนอักขระด้วยรหัส ASCII ที่รู้จัก (ตั้งแต่ 0 ถึง 255):

ต่อไปนี้คือวิธีการรับตารางรหัสสำหรับอักขระตัวอักษรทั้งหมด:

เลือก CHAR(ASCII("a")+ num-1) ตัวอักษร, ASCII("a")+ num - 1 FROM (SELECT 5*5*(a-1)+5*(b-1) + c AS num จาก (เลือก 1 a UNION ทั้งหมด เลือก 2 UNION ทั้งหมด เลือก 3 UNION ทั้งหมด เลือก 4 UNION ทั้งหมด เลือก 5) x CROSS JOIN (เลือก 1 b UNION ทั้งหมด เลือก 2 UNION ทั้งหมด เลือก 3 UNION ทั้งหมด เลือก 4 UNION ทั้งหมด เลือก 5) y CROSS JOIN ( SELECT 1 c UNION ทั้งหมด เลือก 2 UNION ทั้งหมด เลือก 3 UNION ทั้งหมด เลือก 4 UNION ทั้งหมดเลือก 5) z) x โดยที่ ASCII("a")+ num -1 ระหว่าง ASCII("a") และ ASCII("z")

ฉันอ้างอิงผู้ที่ยังไม่ทราบถึงการสร้างลำดับตัวเลขไปยังบทความที่เกี่ยวข้อง

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

ฉันคิดว่าการเพิ่มจดหมายนี้ลงบนโต๊ะคงไม่ยากเกินไปหากจำเป็น

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

ชารินเด็กซ์( ค้นหา_การแสดงออก, string_expression[, start_position])

นี่คือพารามิเตอร์จำนวนเต็มที่ไม่บังคับ start_positionกำหนดตำแหน่งในนิพจน์สตริงที่ใช้ค้นหา ค้นหา_การแสดงออก- หากละเว้นพารามิเตอร์นี้ การค้นหาจะดำเนินการตั้งแต่ต้น string_expression- เช่น ขอ

ควรสังเกตว่าหากสตริงย่อยหรือนิพจน์สตริงที่ค้นหาเป็น NULL ผลลัพธ์ของฟังก์ชันก็จะเป็น NULL เช่นกัน

ตัวอย่างต่อไปนี้กำหนดตำแหน่งของอักขระ "a" ตัวแรกและตัวที่สองในชื่อเรือ "California"

แต่ตัวอย่างเช่น คุณจะค้นหาชื่อเรือที่มีลำดับอักขระสามตัวได้อย่างไร โดยตัวแรกและตัวสุดท้ายคือ "e":

ห้องอบไอน้ำไป ซ้ายการทำงาน ขวาส่งกลับจำนวนอักขระที่ระบุไปทางขวาจากนิพจน์สตริง:

ขวา(<นิพจน์สตริง>,<จำนวนตัวอักษร>)

ตัวอย่างเช่น นี่คือวิธีที่คุณสามารถกำหนดชื่อเรือที่ขึ้นต้นและลงท้ายด้วยตัวอักษรเดียวกัน:

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

หากต้องการกำจัดกรณีนี้คุณสามารถใช้ฟังก์ชันที่มีประโยชน์อื่นได้ เลน (<นิพจน์สตริง>) ซึ่งส่งคืนจำนวนอักขระในสตริง ลองจำกัดตัวเองในกรณีที่จำนวนอักขระมากกว่าหนึ่งตัว:

การทำงาน ทำซ้ำปัดค่าคงที่ "abcde" ด้วยช่องว่างห้าช่องทางด้านขวา ซึ่งฟังก์ชันไม่ได้นำมาพิจารณา เลน, - ในทั้งสองกรณีเราได้ 5
การทำงาน ความยาวข้อมูลส่งกลับจำนวนไบต์ในการแทนค่าของตัวแปรและแสดงให้เราเห็นความแตกต่างระหว่างประเภท CHAR และ VARCHAR ความยาวข้อมูลจะให้ 12 สำหรับประเภท CHAR และ 10 สำหรับประเภท VARCHAR
อย่างที่คุณคาดหวัง ความยาวข้อมูลสำหรับตัวแปรประเภท VARCHAR จะส่งกลับความยาวจริงของตัวแปร แต่เหตุใดผลลัพธ์จึงกลายเป็น 12 สำหรับตัวแปรประเภท CHAR ประเด็นก็คือ CHAR นั้นเป็นประเภท ความยาวคงที่- หากค่าของตัวแปรน้อยกว่าความยาว และเราประกาศความยาวเป็น CHAR(12) ค่าของตัวแปรจะถูก "จัดแนว" ตามความยาวที่ต้องการโดยการเพิ่มช่องว่างต่อท้าย

มีงานบนไซต์ที่คุณต้องจัดเรียง (ค้นหาค่าสูงสุด ฯลฯ ) ตามลำดับตัวเลขของค่าที่แสดงในรูปแบบข้อความ ตัวอย่างเช่น หมายเลขที่นั่งบนเครื่องบิน (“2d”) หรือความเร็วซีดี (“24x”) ปัญหาคือข้อความถูกจัดเรียงเช่นนี้ (จากน้อยไปมาก)

หากคุณต้องการจัดเรียงสถานที่โดยเรียงลำดับแถวจากน้อยไปมาก ลำดับควรเป็นดังนี้

ถ้าเราจำกัดตัวเองไว้เท่านี้ เราก็จะได้

สิ่งที่เหลืออยู่คือการจัดเรียง

ฟังก์ชันและตัวดำเนินการสตริงพื้นฐานมีความสามารถที่หลากหลายและส่งกลับค่าสตริงตามผลลัพธ์ ฟังก์ชันสตริงบางฟังก์ชันเป็นแบบสององค์ประกอบ ซึ่งหมายความว่าสามารถทำงานบนสองสตริงพร้อมกันได้ มาตรฐาน SQL 2003 รองรับฟังก์ชันสตริง

ตัวดำเนินการต่อข้อมูล

SQL 2003 กำหนดตัวดำเนินการต่อข้อมูล (||) ซึ่งรวมสองสตริงที่แยกจากกันเป็นค่าสตริงเดียว

แพลตฟอร์ม DB2

แพลตฟอร์ม DB2 รองรับตัวดำเนินการเชื่อมต่อ SQL 2003 เช่นเดียวกับฟังก์ชัน CONCAT ที่มีความหมายเหมือนกัน

แพลตฟอร์มมายเอสคิวแอล

แพลตฟอร์ม MySQL รองรับฟังก์ชัน CONCATQ ซึ่งเป็นคำพ้องสำหรับตัวดำเนินการต่อข้อมูล SQL 2003

ออราเคิล และ PostgreSQL

แพลตฟอร์ม PostgreSQL และ Oracle รองรับตัวดำเนินการเชื่อมแถบแนวตั้งคู่ของ SQL 2003

แพลตฟอร์มเซิร์ฟเวอร์ SQL

แพลตฟอร์ม SQL Server ใช้เครื่องหมายบวก (+) เป็นคำพ้องสำหรับตัวดำเนินการเชื่อมต่อ SQL 2003 SQL Server มีพารามิเตอร์ระบบ CONCAT_NULL_YIELDS_NULL ที่ควบคุมวิธีการทำงานของระบบหากพบค่า NULL เมื่อเชื่อมต่อค่าสตริง

/* ไวยากรณ์ SQL 2003 */

stringl || string2 || สตริง3

string1string2string3

/* สำหรับ MySQL */

CONCAT("stringl", "string2")

หากค่าที่ต่อกันใด ๆ ว่างเปล่า ระบบจะส่งกลับสตริงว่าง นอกจากนี้ หากค่าตัวเลขเกี่ยวข้องกับการต่อข้อมูล ค่านั้นจะถูกแปลงเป็นค่าสตริงโดยปริยาย

SELECT CONCAT("ของฉัน ", "โบโลญญา", "มี", "a", "ครั้งแรก", "ชื่อ...");

โบโลญญาของฉันมีชื่อจริง

เลือก CONCAT("My ", NULL, "has", "first", "name...");

แปลงและแปล

ฟังก์ชัน CONVERT จะเปลี่ยนการแสดงสตริงอักขระภายในชุดอักขระและการจัดเรียง ตัวอย่างเช่น สามารถใช้ฟังก์ชัน CONVERT เพื่อเปลี่ยนจำนวนบิตต่ออักขระได้

ฟังก์ชัน TRANSLATE แปลค่าสตริงจากชุดอักขระหนึ่งไปยังอีกชุดหนึ่ง ตัวอย่างเช่น ฟังก์ชัน TRANSLATE สามารถใช้เพื่อแปลงค่าจากชุดอักขระภาษาอังกฤษเป็นชุดอักขระคันจิ (ญี่ปุ่น) หรือซีริลลิก (รัสเซีย) การแปลต้องมีอยู่แล้ว - ไม่ว่าจะระบุโดยค่าเริ่มต้นหรือสร้างขึ้นโดยใช้คำสั่ง CREATE TRANSLATION

ไวยากรณ์ SQL 2003

CONVERT ( character_value โดยใช้ character_conversion_name )

TRANSLATE(ตัวละคร_ค่าโดยใช้ชื่อการแปล)

ฟังก์ชัน CONVERT จะแปลงค่าอักขระเป็นชุดอักขระด้วยชื่อที่ระบุในพารามิเตอร์ character_conversion_name ฟังก์ชัน TRANSLATE จะแปลงค่าอักขระเป็นชุดอักขระที่ระบุใน Translation_name

ในบรรดาแพลตฟอร์มที่ได้รับการตรวจสอบ มีเพียง Oracle เท่านั้นที่สนับสนุนฟังก์ชัน CONVERT และ TRANSLATE ตามที่กำหนดไว้ในมาตรฐาน SQL 2003 การใช้ฟังก์ชัน TRANSLATE ของ Oracle นั้นคล้ายคลึงกับ SQL 2003 มาก ในการใช้งานนี้ ฟังก์ชันรับเพียงสองอาร์กิวเมนต์และแปลระหว่างชุดอักขระฐานข้อมูลและชุดอักขระที่เปิดใช้งานภาษาประจำชาติเท่านั้น

การใช้ฟังก์ชัน CONV ของ MySQL จะแปลงตัวเลขจากฐานหนึ่งไปอีกฐานหนึ่งเท่านั้น การใช้ฟังก์ชัน CONVERT ของ SQL Server มีความสามารถค่อนข้างมากและเปลี่ยนประเภทข้อมูลของนิพจน์ แต่ในแง่อื่น ๆ ทั้งหมดจะแตกต่างจากฟังก์ชัน CONVERT มาตรฐานของ SQL 2003 แพลตฟอร์ม PostgreSQL ไม่รองรับฟังก์ชัน CONVERT และการใช้งานของ ฟังก์ชัน TRANSLATE จะแปลงสตริงอักขระที่เกิดขึ้นทั้งหมดไปเป็นสตริงอักขระอื่น

ดีบี2

แพลตฟอร์ม DB2 ไม่รองรับฟังก์ชัน CONVERT และการรองรับฟังก์ชัน TRANSLATE ไม่สอดคล้องกับ ANSI ฟังก์ชัน TRANSLATE ใช้ในการแปลงสตริงย่อยและในอดีตมีความหมายเหมือนกันกับฟังก์ชัน UPPER เนื่องจากฟังก์ชัน UPPER เพิ่งถูกเพิ่มลงใน DB2 เท่านั้น หากใช้ฟังก์ชัน TRANSLATE ใน DB2 โดยมีอาร์กิวเมนต์เดียวเป็นนิพจน์อักขระ ผลลัพธ์จะเป็นสตริงเดียวกันที่แปลงเป็นตัวพิมพ์ใหญ่ หากใช้ฟังก์ชันกับอาร์กิวเมนต์หลายตัว เช่น TRANSLATE(ucmo4HUK, แทนที่, จับคู่) ฟังก์ชันจะแปลงอักขระทั้งหมดในแหล่งที่มาซึ่งอยู่ในพารามิเตอร์การจับคู่ด้วย อักขระทุกตัวในแหล่งที่มาซึ่งอยู่ในตำแหน่งเดียวกับในพารามิเตอร์การจับคู่จะถูกแทนที่ด้วยอักขระจากพารามิเตอร์แทนที่ ด้านล่างนี้เป็นตัวอย่าง

แปล("สวัสดีชาวโลก!") "สวัสดีชาวโลก!"

TRANSLATE("สวัสดี World1", "wZ", "1W") "Hewwo, Zorwd1

MySQL

แพลตฟอร์ม MySQL ไม่รองรับฟังก์ชัน TRANSLATE และ CONVERT

ออราเคิล

แพลตฟอร์ม Oracle รองรับไวยากรณ์ต่อไปนี้สำหรับฟังก์ชัน CONVERT และ TRANSLATE

ในการใช้งานของ Oracle ฟังก์ชัน CONVERT จะส่งกลับข้อความของค่าอักขระที่แปลงเป็น target_charset_set พารามิเตอร์ char_value คือสตริงที่จะแปลง target_charset_set คือชื่อของชุดอักขระที่จะแปลงสตริง และพารามิเตอร์ source_charset คือชุดอักขระซึ่งค่าสตริงถูกจัดเก็บไว้ตั้งแต่แรก

ฟังก์ชัน TRANSLATE ใน Oracle เป็นไปตามไวยากรณ์ ANSI แต่คุณสามารถเลือกชุดอักขระได้เพียงชุดเดียวจากสองชุด: ชุดอักขระฐานข้อมูล (CHARJCS) และชุดอักขระภาษาประจำชาติ (NCHARJZS)

Oracle ยังสนับสนุนฟังก์ชันอื่นที่เรียกว่า TRANSLATE (โดยไม่ต้องใช้คีย์เวิร์ด USING) ฟังก์ชัน TRANSLATE นี้ไม่เกี่ยวข้องกับการแปลงชุดอักขระ

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

Oracle รองรับชุดอักขระทั่วไปหลายชุด ซึ่งรวมถึง US7ASCII และ WE8DECDEC WE8HP, F7DEC, WE8EBCDIC500, WE8PC850u WE8ISO8859PI. ตัวอย่างเช่น:

เลือกแปลง ("Gro2", "US7ASCII", "WE8HP") จาก DUAL;

PostgreSQL

แพลตฟอร์ม PostgreSQL รองรับคำสั่ง CONVERT มาตรฐาน ANSI และสามารถกำหนดการแปลงที่นี่ได้โดยใช้คำสั่ง CREATE CONVERSION การใช้ฟังก์ชัน TRANSLATE ของ PostgreSQL มอบชุดฟังก์ชันเพิ่มเติมที่ช่วยให้คุณสามารถแปลงข้อความให้เป็นข้อความอื่นภายในสตริงที่ระบุได้

แปล (สตริงอักขระ from_text, to_text)

นี่คือตัวอย่างบางส่วน:

เลือกแปล("12345abcde", "5a", "XX"); "1234XXbcde" เลือกแปล (ชื่อ "คอมพิวเตอร์", "พีซี") จากชื่อ WHERE type = "Personal_computer" เลือกแปลง ("PostgreSQL" โดยใช้ iso_8859_1_to_utf_8) "PostgreSQL"

เซิร์ฟเวอร์ SQL

แพลตฟอร์ม SQL Server ไม่รองรับฟังก์ชัน TRANSLATE การใช้งานฟังก์ชัน CONVERT ใน SQL Server ไม่สอดคล้องกับมาตรฐาน SQL 2003 ฟังก์ชันนี้ใน SQL Server เทียบเท่ากับฟังก์ชัน CAST

แปลง (data_type[(ความยาว) | (ความแม่นยำ สเกล)], การแสดงออก, สไตล์])

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

เลือกชื่อ, แปลง (ถ่าน (7), ytd_sales) จากชื่อ เรียงตามชื่อ GO

วันนี้ผมขอเสนอตัวอย่างการใช้งานง่ายๆ ฟังก์ชันสตริง Transact-SQLและไม่ใช่แค่คำอธิบายและตัวอย่างของฟังก์ชันบางอย่างเท่านั้น แต่ยังรวมถึงการรวมกันของฟังก์ชันเหล่านั้นด้วย เช่น จะซ้อนกันได้อย่างไร เพราะการทำงานหลายๆ งานแบบมาตรฐานยังไม่เพียงพอและต้องใช้ร่วมกัน ดังนั้นฉันจึงอยากจะแสดงตัวอย่างง่ายๆ สองสามตัวอย่างในการเขียนข้อความค้นหาดังกล่าว

คุณและฉันได้ดูฟังก์ชันสตริง SQL แล้ว แต่เนื่องจากการใช้งานภาษานี้ใน DBMS ที่แตกต่างกันนั้นแตกต่างกัน ตัวอย่างเช่น บางฟังก์ชันไม่ได้อยู่ใน Transact-SQL แต่อยู่ใน PL/PGSql และเป็นเพียงครั้งสุดท้ายที่เราดู ที่ฟังก์ชันสตริงที่สามารถใช้ใน plpgsql ได้ ดังนั้นวันนี้เราจะมาพูดถึง Transact-SQL โดยเฉพาะ

วิธีรวม SUBSTRING, CHARINDEX และ LEN

ตัวอย่างเช่น คุณต้องค้นหาส่วนหนึ่งของสตริงตามเกณฑ์ที่กำหนดแล้วตัดออก ไม่ใช่แค่ค้นหาส่วนของประเภทเดียวกันเท่านั้น แต่ในแบบไดนามิก เช่น สตริงการค้นหาจะแตกต่างกันไปในแต่ละสตริง เราจะเขียนตัวอย่างใน Management Studio SQL Server 2008

ในการทำเช่นนี้เราจะใช้ฟังก์ชันต่อไปนี้:

  • สตริงย่อย(str, start, len) – ฟังก์ชันนี้จะตัดส่วนหนึ่งของสตริงออกจากสตริงอื่น มีพารามิเตอร์สามตัว 1. นี่คือสตริงเอง; 2. ตำแหน่งเริ่มต้นที่จะเริ่มตัด 3. จำนวนตัวอักษรที่ต้องตัด
  • ชารินเด็กซ์(str1, str2) - ค้นหา str1 ใน str2 และส่งกลับหมายเลขซีเรียลของอักขระตัวแรกหากพบสตริงดังกล่าว มีพารามิเตอร์ทางเลือกตัวที่สาม ซึ่งคุณสามารถระบุได้ว่าจะเริ่มค้นหาจากด้านใด
  • เลน(str1) - ความยาวสตริง เช่น จำนวนตัวอักษร

อย่างที่คุณเห็น ที่นี่ฉันใช้การประกาศตัวแปร และคุณสามารถแทนที่ฟิลด์ของคุณเองในคำขอแทนตัวแปรได้ นี่คือรหัสของตัวเอง:

ประกาศ @rezult เป็น varchar(10) --source string ประกาศ @str1 เป็น varchar(100) --search string ประกาศ @str2 เป็น varchar(10) set @str1 = "ทดสอบสตริงเพื่อค้นหาสตริงอื่นในนั้น" set @str2 = "string" set @rezult=substring(@str1,CHARINDEX(@str2, @str1), LEN(@str2)) เลือก @rezult

ประเด็นก็คือ: เมื่อใช้ฟังก์ชัน len เราจะค้นหาจำนวนอักขระที่ต้องตัด และ charindex จะกำหนดตำแหน่งที่เราต้องเริ่มตัด จากนั้นสตริงย่อยจะทำการเลือกในสตริงตามลำดับ

วิธีรวมซ้าย ขวา และเลน

สมมติว่าคุณต้องได้อักขระสองสามตัวแรกในสตริง หรือตรวจสอบอักขระแรกเหล่านี้ในสตริงว่ามีบางสิ่งอยู่หรือไม่ เช่น ตัวเลขบางประเภท และความยาวของมันแตกต่างกันตามธรรมชาติ (ตัวอย่างคือ แน่นอน แบบทดสอบ)

  • ซ้าย(str, kol) – ฟังก์ชั่นตัดจำนวนอักขระที่ระบุออกจากด้านซ้าย มีพารามิเตอร์สองตัว ตัวแรกคือสตริง และตัวที่สองคือจำนวนอักขระ
  • ขวา(str, kol) - ฟังก์ชั่นตัดจำนวนอักขระที่ระบุออกจากด้านขวาพารามิเตอร์จะเหมือนกัน

ตอนนี้เราจะใช้คำสั่งง่ายๆ กับตาราง

ขั้นแรก เรามาสร้างตาราง test_table:

สร้างตาราง ( IDENTITY(1,1) ไม่เป็น NULL, (18, 0) NULL, (50) NULL, ข้อ จำกัด คีย์หลักที่คลัสเตอร์ ( ASC) ด้วย (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = เปิด) เปิด) ดำเนินต่อไป

มาเติมข้อมูลทดสอบแล้วเขียนคำสั่งต่อไปนี้:

ดังที่คุณเข้าใจ แบบสอบถามแรกเป็นเพียงการเลือกแถวทั้งหมด (พื้นฐาน SQL - คำสั่งเลือก) และแบบสอบถามที่สองคือการรวมกันโดยตรงของฟังก์ชันของเรา นี่คือโค้ด:

เลือก * จาก test_table เลือกหมายเลข ซ้าย (ข้อความ, LEN (หมายเลข)) เป็น str จาก test_table

และถ้าตัวเลขเหล่านี้อยู่ทางขวา เราก็จะใช้ฟังก์ชันนี้ ขวา.

ใช้ Rtrim, Ltrim, Upper และ Lower ร่วมกัน

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

  • ริทริม(str) – ลบช่องว่างทางด้านขวา;
  • ลิทริม(str) – ลบช่องว่างทางด้านซ้าย;
  • บน(str) – แปลงสตริงเป็นตัวพิมพ์ใหญ่;
  • ต่ำกว่า(str) - แปลงสตริงเป็นตัวพิมพ์เล็ก

อย่างที่คุณเห็น เพื่อความปลอดภัยที่นี่เราก็ใช้เช่นกัน สตริงย่อยและ เลน- ความหมายของข้อความค้นหานั้นเรียบง่าย โดยลบช่องว่างทั้งด้านขวาและซ้าย จากนั้นแปลงอักขระตัวแรกให้เป็นตัวพิมพ์ใหญ่โดยการตัดออก จากนั้นจึงเชื่อม (ตัวดำเนินการ +) อักขระนี้กับสตริงที่เหลือ นี่คือรหัส:

ประกาศ @str1 เป็น varchar(100) set @str1 = " สตริงทดสอบที่มีช่องว่างนำหน้าและต่อท้าย " select @str1 select upper(substring(rtrim(ltrim(@str1)),1,1))+ lower(substring( rtrim( ltrim(@str1)),2,LEN(rtrim(@str1)))-1))

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