แปลงข้อความเป็นตัวเลขในแบบสอบถาม MySQL


140

สามารถแปลงข้อความเป็นตัวเลขภายในแบบสอบถาม MySQL ได้หรือไม่? ฉันมีคอลัมน์ที่มีตัวระบุซึ่งประกอบด้วยชื่อและตัวเลขในรูปแบบ "ชื่อ - หมายเลข" คอลัมน์นี้มีประเภท VARCHAR ฉันต้องการจัดเรียงแถวตามหมายเลข (แถวที่มีชื่อเดียวกัน) แต่คอลัมน์จะเรียงตามลำดับอักขระเช่น

name-1
name-11
name-12
name-2

หากฉันตัดตัวเลขฉันสามารถแปลงหมายเลข 'varchar' เป็นจำนวน 'จริง' และใช้เพื่อจัดเรียงแถวได้หรือไม่ ฉันต้องการรับคำสั่งต่อไปนี้

name-1
name-2
name-11
name-12

ฉันไม่สามารถแสดงตัวเลขเป็นคอลัมน์แยกต่างหาก

แก้ไขเมื่อ 2011-05-11 9:32

ฉันพบวิธีแก้ไขต่อไปนี้... ORDER BY column * 1แล้ว หากชื่อไม่มีตัวเลขจะถูกบันทึกเพื่อใช้โซลูชันนั้นหรือไม่?


1
ชื่อเป็นสิ่งชื่อหรืออาจเป็นตัวอักษรใด ๆ ? ฉันหมายถึง: มันยาวสี่ตัวอักษรหรือเป็นชื่อจริง?
Marco

nameสามารถเป็นลำดับของตัวอักษรใดก็ได้
czuk

1
เป็นไปได้ที่จะทำซ้ำการเรียงลำดับตามธรรมชาติ mysql
Shakti Singh

คำตอบ:


262

สิ่งนี้ควรใช้งานได้:

SELECT field,CONVERT(SUBSTRING_INDEX(field,'-',-1),UNSIGNED INTEGER) AS num
FROM table
ORDER BY num;

1
คุณช่วยเพิ่มคำอธิบายและลิงค์ไปยังเอกสารได้ไหม
Angelo Fuchs

สตริงของฉันเหมือนกับ "name-abc12" การเพิ่มรหัสของคุณจะใช้ได้เฉพาะเมื่ออักขระเริ่มต้นหลัง "-" ไม่ได้ขึ้นต้นด้วยตัวอักษร @Marco ช่วยบอกวิธีละเว้นตัวอักษรโดยไม่มีเงื่อนไขได้ไหม?
Eduardo

1
@Eduardo คำถามของฉันควรจะได้รับสตริงหลัง "-" และแปลงเป็นตัวเลข (ต้องเป็นตัวเลข) ในกรณีของคุณฉันจะใช้นิพจน์ทั่วไปต่อไป ...
มาร์โก

@Marco การแสดงออกปกติทำได้ขอบคุณสำหรับเคล็ดลับ
Eduardo

ข้อมูลเพิ่มเติมเกี่ยวกับคำสั่งนี้
Anchith Acharya

34

คุณสามารถใช้SUBSTRINGและCONVERT:

SELECT stuff
FROM table
WHERE conditions
ORDER BY CONVERT(SUBSTRING(name_column, 6), SIGNED INTEGER);

ที่ไหนname_columnเป็นคอลัมน์ที่มี "name-" ค่า SUBSTRINGลบทุกอย่างขึ้นก่อนที่จะมีตัวละครที่หก (เช่น "name-" คำนำหน้า) แล้วCONVERTแปลงที่เหลือไปเป็นจำนวนเต็มจริง

อัปเดต : เมื่อพิจารณาถึงสถานการณ์ที่เปลี่ยนแปลงไปในความคิดเห็น (เช่นคำนำหน้าสามารถเป็นอะไรก็ได้) คุณจะต้องLOCATEผสมผสาน:

ORDER BY CONVERT(SUBSTRING(name_column, LOCATE('-', name_column) + 1), SIGNED INTEGER);

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

name สามารถเป็นลำดับของตัวอักษรใดก็ได้

ดังนั้นจึงควรเป็นสมมติฐานที่ปลอดภัย


เมื่อตอบความคิดเห็นของฉันเขาบอกเราว่าชื่ออาจเป็นลำดับของตัวอักษรใดก็ได้ดังนั้นฉันไม่แน่ใจว่าคุณสามารถSUBSTRING(name_column, 6)ใช้ได้ ฉันรู้ว่าคุณโพสต์เมื่อเขาไม่ได้บอกเราเรื่องนี้ ...
มาร์โก

@Marco: ขอบคุณสำหรับการแจ้งให้ทราบล่วงหน้าฉันได้เพิ่มการอัปเดตที่ควรดูแลข้อมูลใหม่เกี่ยวกับคำนำหน้า แต่ใช่ SUBSTRING_INDEX ของคุณดีกว่า
สั้นเกินไป

23

เพียงใช้แคสต์

CAST(column_name AS UNSIGNED)

ประเภทของผลการร่ายสามารถเป็นหนึ่งในค่าต่อไปนี้:

BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL[(M[,D])]
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]

14

คุณสามารถใช้CAST ()เพื่อแปลงจากสตริงเป็น int เช่นSELECT CAST('123' AS INTEGER);


16
เฉพาะรุ่นหรือไม่ ฉันจำเป็นต้องใช้SELECT CAST('123' AS SIGNED INTEGER);หรือSELECT CAST('123' AS UNSIGNED INTEGER);เพื่อให้มันใช้งานได้
กุ๊ย

10
SELECT *, CAST(SUBSTRING_INDEX(field, '-', -1) AS UNSIGNED) as num FROM tableName ORDER BY num;

1
คุณแน่ใจหรือไม่ว่า ORDER BY ใช้ num เป็นตัวเลขโดยไม่ใช้ CONVERT ฉันไม่แน่ใจ แต่ก็เป็นได้ .. ฉันแค่ถามตัวเอง :)
Marco

6

วิธีง่ายๆเพียงวิธีเดียวคือเลือก "123" + 0


แม้ว่ารหัสนี้อาจช่วยแก้ปัญหาได้ แต่การให้บริบทเพิ่มเติมเกี่ยวกับสาเหตุและ / หรือวิธีการตอบคำถามจะช่วยเพิ่มมูลค่าในระยะยาวได้อย่างมาก โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบาย
Toby Speight

สิ่งนี้ไม่ได้ตอบคำถาม แต่เป็นคำตอบที่ฉันกำลังมองหา
Sagar Shah

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

2

หากต้องการรับหมายเลขให้ลองSUBSTRING_INDEX(field, '-', 1)แปลง


2
คุณต้องเปลี่ยน 1 เป็น -1 dev.mysql.com/doc/refman/5.0/en/…
Gaurav

2

หากคีย์หลักของคุณเป็นสตริงในรูปแบบเช่น

ABC / EFG / EE / 13/123 (หมายเลขลำดับ)
สตริงประเภทนี้สามารถใช้ในการจัดเรียงด้วยตัวคั่น ("/") ได้อย่างง่ายดาย

เราสามารถใช้แบบสอบถามต่อไปนี้เพื่อจัดลำดับตารางด้วยคีย์ประเภทนี้

SELECT * FROM `TABLE_NAME` ORDER BY 
CONVERT(REVERSE(SUBSTRING(REVERSE(`key_column_name`), 1, LOCATE('/', REVERSE(`key_column_name`)) - 1)) , UNSIGNED INTEGER) DESC


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