วิธีใช้คำสั่ง SQL เรียงตามคำสั่งเพื่อเรียงลำดับตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ผล?


144

ฉันมีฐานข้อมูล SQLite ที่ฉันพยายามเรียงลำดับตามตัวอักษร ปัญหาคือ SQLite ดูเหมือนจะไม่พิจารณา A = a ระหว่างการเรียงลำดับดังนั้นฉันจึงได้ผลลัพธ์ดังนี้:

A B C T a b c g

ฉันอยากจะได้:

A b B C c g T

สิ่งพิเศษ SQL ต้องทำอะไรที่ฉันไม่รู้

SELECT * FROM NOTES ORDER BY title

2
และวิธีที่มีประสิทธิภาพมากขึ้นที่จะทำคืออะไร? "ORDER BY TITLE COLLATE NOCASE" หรือ "ORDER BY LOWER (TITLE)" (ในกรณีของฉันคือการทำงานบน Android เช่น SQLite)
Pascal

คำตอบ:


253

ORDER BY TITLE COLLATE NOCASEนอกจากนี้คุณยังสามารถทำ

แก้ไข: หากคุณต้องการระบุASCหรือDESCเพิ่มสิ่งนี้หลังจากNOCASEชอบ

ORDER BY TITLE COLLATE NOCASE ASC

หรือ

ORDER BY TITLE COLLATE NOCASE DESC

8
"ORDER BY TITLE COLLATE NOCASE" มีประสิทธิภาพมากกว่า "ORDER BY LOWER (TITLE)" หรือไม่
Pascal

นั่นเป็นเรื่องที่! ไม่ใช่เหรอ ว้าว! เหตุใด SQLite ของ heck ทำให้ตัวพิมพ์เล็กและใหญ่ไม่เหมาะสำหรับการจัดเรียง ...
Vincy

1
@ วินนี่: ฉันไม่เห็นว่ามีอะไรแปลก ๆ เกี่ยวกับการเปรียบเทียบสตริงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ว่าวิธีการ<, ==ฯลฯ ประกอบการทำงานโดยเริ่มต้นในการเขียนโปรแกรมภาษาทุกคนที่ฉันคุ้นเคยกับ
dan04

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

สิ่งนี้มักจะไม่ทำงานนอกกรอบหากฐานข้อมูลใช้ UTF8 (โปรดสังเกตว่าชื่อไม่ได้อ้างถึงเพียง SQLite) ในกรณีนี้คำแนะนำในการใช้ตัวลด () หรือด้านบน () ด้านล่างนี้เป็นคำที่ใช้งานได้
marco

99

คุณสามารถแปลงทุกอย่างเป็นตัวพิมพ์เล็กเพื่อจุดประสงค์ในการจัดเรียง:

SELECT * FROM NOTES ORDER BY LOWER(title);

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

SELECT * FROM NOTES ORDER BY LOWER(title), title;

1
ฉันกำลังเรียงลำดับตามคอลัมน์ต่าง ๆ ฉันต้องวาง LOWER ไว้แต่ละอันหรือไม่?
CodeFusionMobile

2
ใช่ไม่มีวิธีใดที่จะเปลี่ยนพฤติกรรมของ ORDER BY ให้เป็นแบบไม่ตรงตามตัวพิมพ์ใหญ่ - เล็ก
ชาดเบิร์ช

1
จะมีความแตกต่างระหว่าง 'บน' และ 'LOWER'
Jagadeesh

2
เพื่อจุดประสงค์นี้พวกเขาทั้งสองจะไม่ได้รับผลกระทบเหมือนกันซึ่งจะทำให้กรณีของทุกรายการเหมือนกัน
Ben Baron

1
พวกเขาแตกต่างกันเฉพาะสำหรับตัวละคร [] ^ _ `
dan04

0
SELECT * FROM NOTES ORDER BY UPPER(title)              

14
ขอบคุณสำหรับคำตอบ. แต่: คำตอบที่ดีมักจะมีคำอธิบายเกี่ยวกับสิ่งที่ทำไปแล้วและทำไมมันถึงทำแบบนั้นไม่เพียง แต่สำหรับ OP แต่สำหรับผู้เยี่ยมชมในอนาคต
B001 ᛦ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.