37

I have a varchar field in my table and I want to sort it. But I need to handle this field as integer. Meaning if sort as text the order is "19,2,20" but I want to get the right order "2,19,20".

Can anyone help me?

6 Answers 6

66

I somehow didn't manage to run the query with CAST. I was always getting Error Code: 1064 near "DECIMAL" (or other numeric type that I chose). So, I found another way to sort varchar as numbers:

SELECT * FROM mytable ORDER BY ABS(mycol) 

A bit simpler and works in my case.

Sign up to request clarification or add additional context in comments.

Comments

31
SELECT * FROM mytable ORDER BY CAST(mycol AS DECIMAL) 

3 Comments

@Quassnoi: Just wondering, but is CASTing more efficient than ORDER BY mycol+0
@dnagirl: DECIMAL will silently truncate everything beyond the [0-9] range, mycol + 0 (which implies CAST AS DOUBLE) will issue a warning. As for performance, I think they're identical.
Abhi Beckert - Can't have a space between CAST and the opening bracket
16

Here is the solution

SELECT * FROM MyTable ORDER BY ABS(MyCol); 

Comments

8

All other answers use ABS, which converts the values into absolute (positive) values, assuming that the integers are positive. A better solution would be to use * 1:

SELECT * FROM mytable ORDER BY mycol * 1

This to prevent casting negative numbers into positive ones. Inspired by: mysql sort string number

Comments

5

You can ABS() for this purpose. ABS() is a mathematical function that returns the absolute (positive) value of the specified expression. So query will be something like this

SELECT * FROM MyTable ORDER BY ABS(MyCol); 

Comments

4

You Can Order varchar field using this code according to your required

SELECT * FROM mytable ORDER BY ABS(mycol) 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.