Home All Groups Group Topic Archive Search About
Author
9 Sep 2005 7:41 PM
Kyle
Hi,

I have a table with a field i sort on which has values like: p100-01,
p101-02, p999-05, p1000-03.  On my order by shows these values like this:

p100-01
p1000-03
p101-02
p999-05

Is there a way around this or since its alpha numeric I am stuck with this?

Thanks

Author
9 Sep 2005 7:56 PM
--CELKO--
You can create a column that pads the strings out the way you want them
and do an ORDER BY it.

CASE WHEN foo_nbr LIKE 'p[0-9][0-9][0-9]-[0-9][0-9]'
           THEN SUBSTRING (foo-nbr, 1,4) + '0' + SUBSTRING (foo-nbr,
5,7)
           ELSE foo_nbr END AS sort_col
Author
9 Sep 2005 8:05 PM
Trey Walpole
if your pattern is always as illustrated (i.e., single
char+number+dash+number) then try

order by convert(decimal(30,5), replace(substring(value,2,9), '-', '.'))

you'll want to adjust the decimal precision and scale based on how many
numbers you'll have before and after the dash, if it's constant or at
least has a specified range.

also, this will not be a fast order, except on a small result set

Kyle wrote:
Show quote
> Hi,
>
> I have a table with a field i sort on which has values like: p100-01,
> p101-02, p999-05, p1000-03.  On my order by shows these values like this:
>
> p100-01
> p1000-03
> p101-02
> p999-05
>
> Is there a way around this or since its alpha numeric I am stuck with this?
>
> Thanks
>
>
Author
9 Sep 2005 8:09 PM
Trey Walpole
.... ["value" in this represents the column name] ....

Trey Walpole wrote:
Show quote
> if your pattern is always as illustrated (i.e., single
> char+number+dash+number) then try
>
> order by convert(decimal(30,5), replace(substring(value,2,9), '-', '.'))
>
> you'll want to adjust the decimal precision and scale based on how many
> numbers you'll have before and after the dash, if it's constant or at
> least has a specified range.
>
> also, this will not be a fast order, except on a small result set
>
> Kyle wrote:
>
>> Hi,
>>
>> I have a table with a field i sort on which has values like: p100-01,
>> p101-02, p999-05, p1000-03.  On my order by shows these values like this:
>>
>> p100-01
>> p1000-03
>> p101-02
>> p999-05
>>
>> Is there a way around this or since its alpha numeric I am stuck with
>> this?
>>
>> Thanks
>>
Author
9 Sep 2005 9:42 PM
Hugo Kornelis
On Fri, 9 Sep 2005 13:41:47 -0600, Kyle wrote:

Show quote
>Hi,
>
>I have a table with a field i sort on which has values like: p100-01,
>p101-02, p999-05, p1000-03.  On my order by shows these values like this:
>
>p100-01
>p1000-03
>p101-02
>p999-05
>
>Is there a way around this or since its alpha numeric I am stuck with this?
>
>Thanks
>

Hi Kyle,

This requirement indicates that the value is not atomic, but that the
numeric parts have different meaning. Instead of using a kludge to fix
the sorting, it's probably better to split the various parts of this
data into seperate columns, and concatenate them when selecting the
data.

Best, Hugo
--

(Remove _NO_ and _SPAM_ to get my e-mail address)
Author
9 Sep 2005 9:47 PM
bagman3rd
I developed a query to do natural alphanumeric sorting.  This query breaks
the alphanumeric string up into chunks of char's and number's, then orders by
the chunks.  It only works for the first 4 chunks.  I haven't had the time,
but I am sure that you could build a trigger to populate a,b,c and d columns
and sort by that.

Archer

select TOP 100 fieldid as 'sortcolumn',
LEFT(fieldid, PATINDEX('%[0-9]%', fieldid) - 1) as 'a',

CASE
WHEN    right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ) not
like '%[a-z,-]%'
then     CAST(right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1
) AS INT)
else
cast    (
    left     (
        right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ),
            case
            when patindex('%[a-z, -]%', right  (fieldid, len(fieldid) -
PATINDEX('%[0-9]%', fieldid) + 1 )) = 0
            then patindex('%[a-z, -]%', right  (fieldid, len(fieldid) -
PATINDEX('%[0-9]%', fieldid) + 1 ))
            else patindex('%[a-z, -]%', right  (fieldid, len(fieldid) -
PATINDEX('%[0-9]%', fieldid) + 1 )) -1
            end
        )
as int)
end
as 'b',

LEFT    (
        right
            (
            right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ),
            len(right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 )) -
patindex('%[a-z, -]%', right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%',
fieldid) + 1 )) + 1
            )
    ,

        CASE
        WHEN     PATINDEX('%[0-9]%',
                right
                    (
                    right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ),
                    len(right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ))
- patindex('%[a-z, -]%', right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%',
fieldid) + 1 )) + 1
                    )
                ) = 0
        THEN
            LEN(    right    (   
                    right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ),
                    len(right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ))
- patindex('%[a-z, -]%', right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%',
fieldid) + 1 )) + 1
                    )
            )
        ELSE    PATINDEX('%[0-9]%',
                right
                    (
                    right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ),
                    len(right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ))
- patindex('%[a-z, -]%', right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%',
fieldid) + 1 )) + 1
                    )
                ) -1
        END
    )
as 'c',

CASE
WHEN    right  (
right    (   
    right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ),
    len(right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 )) -
patindex('%[a-z, -]%', right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%',
fieldid) + 1 )) + 1
    )
, len(
right    (   
    right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ),
    len(right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 )) -
patindex('%[a-z, -]%', right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%',
fieldid) + 1 )) + 1
    )
) - PATINDEX('%[0-9]%',
right    (   
    right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ),
    len(right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 )) -
patindex('%[a-z, -]%', right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%',
fieldid) + 1 )) + 1
    )
) + 1 ) not like '%[a-z,-]%'
then     CAST(right  (
right    (   
    right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ),
    len(right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 )) -
patindex('%[a-z, -]%', right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%',
fieldid) + 1 )) + 1
    )
, len(
right    (   
    right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ),
    len(right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 )) -
patindex('%[a-z, -]%', right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%',
fieldid) + 1 )) + 1
    )
) - PATINDEX('%[0-9]%',
right    (   
    right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ),
    len(right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 )) -
patindex('%[a-z, -]%', right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%',
fieldid) + 1 )) + 1
    )
) + 1 ) AS INT)
else
cast    (
    left     (
        right  (
right    (   
    right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ),
    len(right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 )) -
patindex('%[a-z, -]%', right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%',
fieldid) + 1 )) + 1
    )
, len(
right    (   
    right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ),
    len(right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 )) -
patindex('%[a-z, -]%', right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%',
fieldid) + 1 )) + 1
    )
) - PATINDEX('%[0-9]%',
right    (   
    right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ),
    len(right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 )) -
patindex('%[a-z, -]%', right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%',
fieldid) + 1 )) + 1
    )
) + 1 ),
            case
            when patindex('%[a-z, -]%', right  (
right    (   
    right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ),
    len(right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 )) -
patindex('%[a-z, -]%', right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%',
fieldid) + 1 )) + 1
    )
, len(
right    (   
    right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ),
    len(right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 )) -
patindex('%[a-z, -]%', right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%',
fieldid) + 1 )) + 1
    )
) - PATINDEX('%[0-9]%',
right    (   
    right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ),
    len(right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 )) -
patindex('%[a-z, -]%', right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%',
fieldid) + 1 )) + 1
    )
) + 1 )) = 0
            then patindex('%[a-z, -]%', right  (
right    (   
    right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ),
    len(right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 )) -
patindex('%[a-z, -]%', right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%',
fieldid) + 1 )) + 1
    )
, len(
right    (   
    right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ),
    len(right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 )) -
patindex('%[a-z, -]%', right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%',
fieldid) + 1 )) + 1
    )
) - PATINDEX('%[0-9]%',
right    (   
    right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ),
    len(right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 )) -
patindex('%[a-z, -]%', right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%',
fieldid) + 1 )) + 1
    )
) + 1 ))
            else patindex('%[a-z, -]%', right  (
right    (   
    right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ),
    len(right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 )) -
patindex('%[a-z, -]%', right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%',
fieldid) + 1 )) + 1
    )
, len(
right    (   
    right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ),
    len(right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 )) -
patindex('%[a-z, -]%', right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%',
fieldid) + 1 )) + 1
    )
) - PATINDEX('%[0-9]%',
right    (   
    right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ),
    len(right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 )) -
patindex('%[a-z, -]%', right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%',
fieldid) + 1 )) + 1
    )
) + 1 )) -1
            end
        )
as int)
end
as 'd',

right    (   
    right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 ),
    len(right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%', fieldid) + 1 )) -
patindex('%[a-z, -]%', right  (fieldid, len(fieldid) - PATINDEX('%[0-9]%',
fieldid) + 1 )) + 1
    ) as 'cTEST'

from tblsamplesTEST
order by a,b,c,d

Show quote
"Kyle" wrote:

> Hi,
>
> I have a table with a field i sort on which has values like: p100-01,
> p101-02, p999-05, p1000-03.  On my order by shows these values like this:
>
> p100-01
> p1000-03
> p101-02
> p999-05
>
> Is there a way around this or since its alpha numeric I am stuck with this?
>
> Thanks
>
>
>
Author
10 Sep 2005 10:51 AM
Dieter Noeth
Kyle wrote:

> I have a table with a field i sort on which has values like: p100-01,
> p101-02, p999-05, p1000-03.  On my order by shows these values like this:
>
> p100-01
> p1000-03
> p101-02
> p999-05
>
> Is there a way around this or since its alpha numeric I am stuck with this?

If only the first number has a variable length, but the second number is
always two digits:

order by len(i), i

Dieter

AddThis Social Bookmark Button