คำถามติดแท็ก natural-sort


4
มีการเปรียบเทียบเรียงลำดับสตริงต่อไปนี้ตามลำดับต่อไปนี้ 1,2,3,6,10,10A, 10B, 11 หรือไม่
ฉันมีฐานข้อมูลที่มีคอลัมน์ VARCHAR ที่มีจำนวนเต็มความยาวแตกต่างกัน ฉันต้องการจัดเรียงพวกเขาดังนั้น 10 มาหลังจาก 9 ไม่ใช่ 1 และ 70A มาหลังจาก 70 ฉันสามารถทำได้ด้วยPATINDEX () , คำสั่ง CTE และ CASE ในส่วนคำสั่ง WHERE อย่างไรก็ตามฉันสงสัยว่ามีการเปรียบเทียบที่นี่จะไม่จำเป็น

1
สั่งซื้อโดยการเปรียบเทียบตัวอักษรและตัวเลขผสมกัน
เราจำเป็นต้องทำการรายงานบางอย่างเกี่ยวกับค่าที่มักจะรวมสตริงของตัวเลขและตัวอักษรที่ต้องเรียงลำดับ 'ตามธรรมชาติ' สิ่งที่ต้องการเช่น "P7B18" หรือ "P12B3" @ สายอักขระส่วนใหญ่จะเป็นลำดับของตัวอักษรจากนั้นจึงสลับตัวเลข จำนวนของกลุ่มเหล่านี้และความยาวของแต่ละกลุ่มอาจแตกต่างกันไป เราต้องการเรียงลำดับตัวเลขเหล่านี้ตามลำดับตัวเลข เห็นได้ชัดว่าถ้าฉันจัดการค่าสตริงเหล่านั้นโดยตรงด้วยORDER BY"P12B3" จะมาก่อน "P7B18" เนื่องจาก "P1" เก่ากว่า "P7" แต่ฉันต้องการย้อนกลับเพราะ "P7" อยู่ก่อน "P12" ฉันยังต้องการที่จะทำการเปรียบเทียบช่วงเช่น@bin < 'P13S6'หรือบางอย่างเช่น ฉันไม่ต้องจัดการกับจำนวนจุดลอยตัวหรือจำนวนลบ; สิ่งเหล่านี้จะเป็นจำนวนเต็มที่ไม่ติดลบที่เรากำลังทำอยู่ ความยาวสตริงและจำนวนของเซกเมนต์อาจเป็นไปได้เองโดยไม่ จำกัด ขอบเขต ในกรณีของเราปลอกสตริงนั้นไม่สำคัญแม้ว่าจะมีวิธีการในการเปรียบเทียบการเรียงตัว แต่คนอื่น ๆ อาจพบว่ามีประโยชน์ ส่วนที่น่าเกลียดที่สุดของทั้งหมดนี้คือฉันต้องการที่จะทำทั้งการสั่งซื้อและการกรองช่วงในWHEREข้อ ถ้าฉันทำสิ่งนี้ใน C # มันจะเป็นงานที่ค่อนข้างง่าย: ทำการแยกวิเคราะห์เพื่อแยกอัลฟาจากตัวเลขใช้ IComparable และคุณก็ทำได้โดยทั่วไป แน่นอนว่า SQL Server ไม่ได้เสนอฟังก์ชั่นที่คล้ายกันอย่างน้อยที่สุดเท่าที่ฉันทราบ ใครรู้เทคนิคที่ดีในการทำงานนี้หรือไม่? มีความสามารถเล็กน้อยเผยแพร่ในการสร้างประเภท CLR ที่กำหนดเองที่ใช้ …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.