Chuyển đổi văn bản thành số trong truy vấn MySQL


137

Có thể chuyển đổi văn bản thành số trong truy vấn MySQL không? Tôi có một cột với một mã định danh bao gồm tên và số theo định dạng "tên số". Cột có loại VARCHAR. Tôi muốn sắp xếp các hàng theo số (các hàng có cùng tên) nhưng cột được sắp xếp theo thứ tự ký tự, nghĩa là

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

Nếu tôi cắt số, tôi có thể chuyển đổi số 'varchar' thành số 'thực' và sử dụng nó để sắp xếp các hàng không? Tôi muốn có được thứ tự sau.

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

Tôi không thể biểu diễn số dưới dạng một cột riêng biệt.

chỉnh sửa 2011-05-11 9:32

Tôi đã tìm thấy giải pháp sau đây ... ORDER BY column * 1. Nếu tên sẽ không chứa bất kỳ số nào thì nó có lưu để sử dụng giải pháp đó không?


1
Tên được chính xác tên hoặc nó có thể là bất kỳ ký tự? Ý tôi là: nó là một chuỗi dài bốn ký tự hay là tên thật?
Marco

namecó thể là bất kỳ chuỗi các chữ cái.
czuk

1
bản sao có thể có của phân loại tự nhiên mysql
Shakti Singh

Câu trả lời:


256

Điều này sẽ làm việc:

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

1
bạn có thể thêm một lời giải thích và một liên kết đến tài liệu không?
Fuchs

Chuỗi của tôi giống như "tên-abc12". Bằng cách thêm mã của bạn, nó chỉ hoạt động nếu các ký tự ban đầu sau "-" không bắt đầu bằng một chữ cái. @Marco Bạn có thể cho tôi biết một cách để bỏ qua các chữ cái mà không có điều kiện ở đâu không?
Eduardo

1
@Eduardo truy vấn của tôi được cho là lấy chuỗi sau dấu "-" và chuyển đổi nó thành một số (nó PHẢI là một số). Trong trường hợp của bạn, tôi sẽ tiếp tục sử dụng một biểu thức thông thường có lẽ ...
Marco

@Marco biểu hiện thường xuyên đã làm điều đó, cảm ơn bạn cho tiền boa.
Eduardo

32

Bạn có thể sử dụng SUBSTRINGCONVERT:

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

Trong trường hợp name_columnlà cột với "name" giá trị. Loại SUBSTRINGbỏ mọi thứ lên trước ký tự thứ sáu (tức là tiền tố "tên-") và sau đó CONVERTchuyển đổi phần còn lại thành số nguyên thực.

CẬP NHẬT : Với hoàn cảnh thay đổi trong các nhận xét (ví dụ: tiền tố có thể là bất cứ điều gì), bạn sẽ phải đưa ra một LOCATEhỗn hợp:

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

Tất nhiên, điều này giả định rằng tiền tố không phải là số không có bất kỳ dấu gạch nối nào trong đó nhưng nhận xét có liên quan nói rằng:

name có thể là bất kỳ chuỗi chữ cái

vì vậy đó phải là một giả định an toàn.


Trả lời bình luận của tôi, anh ấy nói với chúng tôi tên có thể là bất kỳ chuỗi ký tự nào, vì vậy tôi không chắc bạn có thể sử dụng SUBSTRING(name_column, 6). Tôi biết, bạn đã đăng nó khi anh ấy không nói với chúng tôi điều này ...
Marco

@Marco: Cảm ơn những người đứng đầu, tôi đã thêm một bản cập nhật cần quan tâm đến thông tin mới về tiền tố. Nhưng vâng, SUBSTRING_INDEX của bạn đẹp hơn.
mu quá ngắn

22

Chỉ cần sử dụng CAST,

CAST(column_name AS UNSIGNED)

Loại cho kết quả truyền có thể là một trong các giá trị sau:

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

14

Bạn có thể sử dụng CAST () để chuyển đổi từ chuỗi sang int. ví dụSELECT CAST('123' AS INTEGER);


15
Là phiên bản cụ thể? Tôi cần phải sử dụng SELECT CAST('123' AS SIGNED INTEGER);hoặc SELECT CAST('123' AS UNSIGNED INTEGER);để làm cho nó hoạt động.
Hobo

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

1
Bạn có chắc chắn rằng ORDER BY sử dụng num làm số mà không sử dụng CONVERT không? Tôi không chắc, nhưng có thể là .. Tôi chỉ đang tự hỏi mình :)
Marco

4

một cách đơn giản CHỌN '123' + 0


Mặc dù mã này có thể giúp giải quyết vấn đề, việc cung cấp ngữ cảnh bổ sung về lý do và / hoặc cách nó trả lời câu hỏi sẽ cải thiện đáng kể giá trị lâu dài của nó. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số lời giải thích.
Toby Speight

Điều này không trả lời câu hỏi nhưng đó là câu trả lời tôi đang tìm kiếm.
Sagar Shah

giải pháp của bạn là thanh lịch và thiết thực nhất - thật không may, bạn không cung cấp nó trong ngữ cảnh của câu hỏi với biểu thức cụ thể cho ví dụ cụ thể - vui lòng sửa đổi nó thành cụ thể.
chukko ngày


2

nếu khóa chính của bạn là một chuỗi có định dạng như

ABC / EFG / EE / 13/123 (số thứ tự)
thì loại chuỗi này có thể dễ dàng được sử dụng để sắp xếp với dấu phân cách ("/")

chúng ta có thể sử dụng truy vấn sau để đặt một bảng với loại khóa này

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


-5

Một cách chung để làm:

SELECT * FROM your_table ORDER BY LENTH(your_column) ASC, your_column ASC
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.