1

I have alphanumeric numbers. After applying sorting thru SQL Server ORDER BY clause, I get following result

select * 
from WO
where WOCode = AnyNumber
order by [ColumnName]

Result:

39660A1
39660A10
39660A11
39660A2
39660A3
39660A4
39660A5
39660A6
39660A7
39660A8
39660A9

Required result

39660A1
39660A2
39660A3
39660A4
39660A5
39660A6
39660A7
39660A8
39660A9
39660A10
39660A11
marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
SanamShaikh
  • 1,699
  • 3
  • 13
  • 22

2 Answers2

2

Here is a quick and dirty solution:

SELECT *
FROM table 
ORDER BY LEN(Field) ASC, Field ASC

Demo here.

Tommaso Belluzzo
  • 23,232
  • 8
  • 74
  • 98
1

Assuming that the letter A is always in the same position, and the characters after it are integers only.

Then you can do this:

WITH CTE AS
(
    SELECT 
        WOCode,
        CAST(SUBSTRING(WOCode, CHARINDEX('A', WOCode) + 1, 
                       LEN(WOCode) - CHARINDEX('A', WOCode) + 1) AS INT) AS DisplayOrder
    FROM 
        WO
) 
SELECT * 
FROM CTE
ORDER BY DisplayOrder;

Demo

Results:

|   WOCode |
|----------|
|  39660A1 |
|  39660A2 |
|  39660A3 |
|  39660A4 |
|  39660A5 |
|  39660A6 |
|  39660A7 |
|  39660A8 |
|  39660A9 |
| 39660A10 |
| 39660A11 |

You can also use TRY_CAST to avoid errors that might result because of using cast with non integer values (Thanks to @zambonee for suggestion):

WITH CTE AS
(
    SELECT 
        WOCode,
        CASE 
           WHEN TRY_CAST(WOCode AS INT) IS NULL 
              THEN CAST(SUBSTRING(WOCode, 
                          CHARINDEX('A', WOCode) + 1, 
                          LEN(WOCode) - CHARINDEX('A', WOCode) + 1) AS INT) 
              ELSE 0 
        END AS DisplayOrder
    FROM  
        WO
) 
SELECT * 
FROM CTE
ORDER BY DisplayOrder;

updated demo

marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459