SQL เรียงลำดับตามสตริง ตัวเลขปรากฏสุดท้าย

ฉันมีคำถามที่ส่งคืนคอลัมน์สตริงที่ฉันต้องการจัดเรียง เมื่อฉันเรียงลำดับตาม ASC/DESC ฉันได้รับผลลัพธ์เดียวกัน นี่คือตัวอย่างผลลัพธ์:

AVI
ksky site
Secure East
Shlomi
VSEStaging
1200165
120186
120186
120186
120032

แต่ฉันอยากให้มีตัวเลขอยู่หน้าสตริงตัวอักษร ตัวอย่างเช่นสำหรับ ASC:

1200165
120186
120186
120186
120032
AVI
ksky site
Secure East
Shlomi
VSEStaging

ตัวอย่างเช่นสำหรับ DESC:

VSEStaging
Shlomi
Secure East
ksky site
AVI
120032

ขณะนี้ฉันใช้ REGEX เช่นนี้:

REGEXP_SUBSTR(UPPER(COLUMN_NAME), '^\D*') ,
TO_NUMBER(REGEXP_SUBSTR(UPPER(COLUMN_NAME), '\d+'))

กรุณาช่วย.


person David Faizulaev    schedule 20.02.2017    source แหล่งที่มา
comment
ลองดู ลิงก์นี้ คำตอบสุดท้าย   -  person Piotr Kamoda    schedule 20.02.2017
comment
โซลูชันที่มีให้นั้นดีสำหรับ ASC แต่สำหรับ DESC   -  person David Faizulaev    schedule 20.02.2017
comment
มันเป็นหนึ่งในสมมติฐานที่ว่าทุกสตริงจะเป็นตัวเลข 100% (ไม่มีอักขระอื่น) หรือตัวอักษร 100% (ไม่มีอักขระอื่น) หรือไม่ หากไม่รับประกัน คุณจะต้องชี้แจง: ควรเรียงลำดับสตริง 123abcd อย่างไร แล้ว #!- - มันควรจะอยู่ในลำดับไหน? ฯลฯ   -  person mathguy    schedule 20.02.2017
comment
@DavidFaiz คุณลองเพิ่ม desc ในโซลูชันที่ส่วนท้ายของ ORDER BY clause หรือไม่   -  person Piotr Kamoda    schedule 20.02.2017


คำตอบ (2)


คุณสามารถใช้ regexp_like() สำหรับการเรียงลำดับจากน้อยไปหามาก:

order by (case when regexp_like(col, '^[0-9]+$') then 1 else 2 end) asc,
         col asc
person Gordon Linoff    schedule 20.02.2017
comment
@DavidFaiz - สิ่งนี้จะใช้ได้กับ ASC และ DESC เพียงเปลี่ยนคำสุดท้ายจาก asc เป็น desc (อย่าแตะโค้ดบรรทัดแรก เฉพาะบรรทัดที่สองเท่านั้น) นี่ถือว่าสตริงของคุณเป็น (1) หลัก 100% และ (2) ทุกอย่างอื่น ดูความคิดเห็น/คำถามของฉันใต้โพสต์ต้นฉบับของคุณ (เพื่อความชัดเจน) - person mathguy; 20.02.2017
comment
@DavidFaiz - คุณลองเปลี่ยนทั้ง asc เป็น desc แล้วหรือยัง - person Alex Poole; 20.02.2017
comment
@AlexPoole - ฉันคิดว่า OP ต้องการตัวเลขที่ด้านบนโดยไม่คำนึงถึง ASC หรือ DESC - ดังนั้นเขาควรเปลี่ยน ASC ที่สองเป็น DESC เท่านั้น - person mathguy; 20.02.2017
comment
@mathguy - นั่นไม่ใช่สิ่งที่แสดงไว้ท้ายคำถาม ที่มีสตริงก่อน (desc อาจไม่คำนึงถึงขนาดตัวพิมพ์เพื่อเพิ่มความสนุกสนาน) ตามด้วยตัวเลข (มีเพียงอันเดียวที่แสดง ไม่แน่ใจว่าควรจะเป็น asc หรือ desc ส่วนอันหลังจะเห็นสมมติฐานที่สมเหตุสมผล) - person Alex Poole; 20.02.2017

คุณสามารถลองสิ่งที่แตกต่างออกไปเช่นนี้:

order by translate(upper(col), '1234567890', 'abcdefghij')
person user6585756    schedule 23.03.2017