Ubah teks menjadi angka dalam kueri MySQL

140

Apakah mungkin untuk mengubah teks menjadi angka dalam kueri MySQL? Saya memiliki kolom dengan pengenal yang terdiri dari nama dan nomor dalam format "nama-nomor". Kolom memiliki tipe VARCHAR. Saya ingin mengurutkan baris sesuai nomor (baris dengan nama yang sama) tetapi kolom diurutkan sesuai urutan karakter, yaitu

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

Jika saya memotong nomornya, dapatkah saya mengubah nomor 'varchar' menjadi nomor 'asli' dan menggunakannya untuk mengurutkan baris? Saya ingin mendapatkan pesanan berikut.

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

Saya tidak dapat merepresentasikan nomor tersebut sebagai kolom terpisah.

diedit 2011-05-11 9:32

Saya telah menemukan solusi berikut ... ORDER BY column * 1. Jika nama tidak akan mengandung angka, apakah aman untuk menggunakan solusi itu?

czuk
sumber
1
nama persis nama atau bisa karakter apa saja? Maksud saya: apakah itu string empat karakter atau nama asli?
Marco
namebisa berupa urutan huruf apa saja.
czuk
1
kemungkinan duplikat dari penyortiran alami mysql
Shakti Singh

Jawaban:

262

Ini harus bekerja:

SELECT field,CONVERT(SUBSTRING_INDEX(field,'-',-1),UNSIGNED INTEGER) AS num
FROM table
ORDER BY num;
Marco
sumber
1
bisakah Anda menambahkan penjelasan dan tautan ke dokumentasi?
Angelo Fuchs
String saya seperti "name-abc12". Dengan menambahkan kode Anda, ini hanya berfungsi jika karakter awal setelah "-" tidak dimulai dengan huruf. @Marco Bisakah Anda memberi tahu saya cara untuk mengabaikan surat tanpa syarat di mana?
Eduardo
1
@Eduardo, kueri saya seharusnya mendapatkan string setelah "-" dan mengubahnya menjadi angka (HARUS berupa angka). Dalam kasus Anda, saya akan terus menggunakan ekspresi reguler mungkin ...
Marco
Ekspresi reguler @Marco berhasil, terima kasih atas tipnya.
Eduardo
Info lebih lanjut tentang perintah ini
Anchith Acharya
34

Anda dapat menggunakan SUBSTRINGdan CONVERT:

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

Di mana name_columnkolom dengan nilai "nama-". The SUBSTRINGmenghapus segala sesuatu sebelum karakter keenam (yaitu "nama-" prefix) dan kemudian CONVERTbertobat kiri ke integer nyata.

PEMBARUAN : Mengingat keadaan yang berubah di komentar (yaitu awalan bisa apa saja), Anda harus memasukkan a LOCATEdalam campuran:

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

Ini tentu saja mengasumsikan bahwa awalan non-numerik tidak memiliki tanda hubung di dalamnya tetapi komentar yang relevan mengatakan bahwa:

name bisa berupa urutan huruf apa saja

jadi itu harus menjadi asumsi yang aman.

mu terlalu pendek
sumber
Menjawab komentar saya, dia memberi tahu kami bahwa nama dapat berupa urutan karakter apa pun, jadi saya tidak yakin Anda dapat menggunakannya SUBSTRING(name_column, 6). Aku tahu, kamu mempostingnya ketika dia tidak memberi tahu kami ini ...
Marco
@Marco: Terima kasih atas perhatiannya, saya menambahkan pembaruan yang seharusnya menangani informasi baru tentang awalan. Tapi ya, SUBSTRING_INDEX Anda lebih bagus.
mu terlalu pendek
23

Cukup gunakan CAST,

CAST(column_name AS UNSIGNED)

Jenis hasil cor dapat menjadi salah satu dari nilai berikut:

BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL[(M[,D])]
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]
Sibin John Mattappallil
sumber
14

Anda dapat menggunakan CAST () untuk mengubah dari string menjadi int. misalnyaSELECT CAST('123' AS INTEGER);

verdesmarald
sumber
16
Apakah versi itu spesifik? Saya perlu menggunakan SELECT CAST('123' AS SIGNED INTEGER);atau SELECT CAST('123' AS UNSIGNED INTEGER);membuatnya berfungsi.
Hobo
10
SELECT *, CAST(SUBSTRING_INDEX(field, '-', -1) AS UNSIGNED) as num FROM tableName ORDER BY num;
Gaurav
sumber
1
Apakah Anda yakin ORDER BY menggunakan num sebagai angka tanpa menggunakan CONVERT? Saya tidak yakin, tapi bisa jadi .. Saya hanya bertanya pada diri sendiri :)
Marco
6

satu cara sederhana PILIH '123' + 0

VRK RAO
sumber
Meskipun kode ini dapat membantu memecahkan masalah, memberikan konteks tambahan mengenai mengapa dan / atau bagaimana kode tersebut menjawab pertanyaan akan secara signifikan meningkatkan nilai jangka panjangnya. Harap edit jawaban Anda untuk menambahkan penjelasan.
Toby Speight
Ini tidak menjawab pertanyaan tetapi itu adalah jawaban yang saya cari.
Sagar Shah
solusi Anda adalah yang paling elegan dan praktis - sayangnya Anda tidak memberikannya dalam konteks pertanyaan dengan ekspresi khusus untuk contoh yang diberikan - harap ubah menjadi spesifik.
chukko
2

jika kunci utama Anda adalah string dalam format seperti

ABC / EFG / EE / 13/123 (nomor urut)
string semacam ini dapat dengan mudah digunakan untuk mengurutkan dengan pemisah ("/")

kita dapat menggunakan query berikut untuk memesan tabel dengan jenis kunci ini

SELECT * FROM `TABLE_NAME` ORDER BY 
CONVERT(REVERSE(SUBSTRING(REVERSE(`key_column_name`), 1, LOCATE('/', REVERSE(`key_column_name`)) - 1)) , UNSIGNED INTEGER) DESC
Harsha
sumber
0
cast(REGEXP_REPLACE(NameNumber, '[^0-9]', '') as UNSIGNED)
Jayram Kumar
sumber
-5

Cara umum untuk melakukannya:

SELECT * FROM your_table ORDER BY LENTH(your_column) ASC, your_column ASC
Azzu
sumber