Billy Pang
tuxedo_man at hotmail.com
Sun Oct 31 18:03:55 CST 2004
Hi Arthur:
Thanks for your input. During the time of the original post, I wasn't
really to sure what all the rules were. But I knew one sorting rule for
certain, which was "sort letters before numbers".
a10x does not come ahead of a10. Not too sure how to articulate it
accurately; the closest I can explain it is "the characters are read from
left to right". If I create two text files in my OS (I am using win2k)
called a10.txt and a10x.txt and sort the files in ascending order, a10.txt
is shown first. I struggled with this rule because in my mind I kept
thinking that "no character" takes greater precedence than "the presence of
a character".
Thanks for your solution but it is not what I am looking for. In a
nutshell, the InnerNumeric_fn function obtains the first complete number in
a string? I like the idea of using a function to manufacture a sorting key.
Your code uses little cpu cycles and reads. I can say that because I
tried re-writing your function without using a "while" condition and
compared the two and this is what I got.
create FUNCTION dbo.InnerNumeric_fn_1(@Source Varchar(10)) RETURNS INT
AS
BEGIN
declare @Result varchar(9)
declare @tempTable TABLE(THE_ID TINYINT NOT NULL PRIMARY KEY
IDENTITY(1,1), THE_VALUE CHAR(1))
INSERT INTO @tempTable VALUES('A');
INSERT INTO @tempTable VALUES('A');
INSERT INTO @tempTable SELECT i.the_value from @tempTable i,
@tempTable ii, @tempTable iii
SELECT @Result = ISNULL(@Result,'') + CASE WHEN THE_ID > 1 AND
isnumeric(substring(@Source,THE_ID,1)) = 1 THEN substring(@Source,THE_ID,1)
ELSE '' END FROM @tempTable;
RETURN CAST(@Result AS INT)
END
go
However, this solution is great for the sample values I posted but it is not
exactly what I am looking for because even though it can handle any number
of digits, I am unable to use it as a sorting solution since it cannot
handle two sets of digits. For example:
a45x1x
a45xax
a45x2x
Sincerely,
Billy
>From: Arthur Fuller <artful at rogers.com>
>Reply-To: dba-sqlserver at databaseadvisors.com
>To: dba-sqlserver at databaseadvisors.com
>Subject: Re: [dba-SQLServer] sorting problem
>Date: Sun, 31 Oct 2004 15:44:53 -0500
>
>I should have added to the preceding message that all this is necessary
>only if the 6 values orginally supplied were just a sample. If they are
>actually all the values that the column can contain, it's much simpler just
>to create a new two-column table containing the values and their desired
>order, expressed as an int. Then you could join said table to the table of
>interest and order by the new table's second column.
>
>The code I provided in the previous message can handle any number of digits
>and any number of trailing characters.
>
>Arthur
>_______________________________________________
>dba-SQLServer mailing list
>dba-SQLServer at databaseadvisors.com
>http://databaseadvisors.com/mailman/listinfo/dba-sqlserver
>http://www.databaseadvisors.com
>