Arthur Fuller
artful at rogers.com
Sun Oct 31 22:08:02 CST 2004
Billy Pang wrote:
> 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
Fine! Fine! Fine! In future, I suggest that you provide your third-world
developers with an adequeate data set. LOL. I shall go back to the salt
mines and toil endlessly until I have a solution. But you still haven't
made the rules quite clear, if I may say so, Sir.
Given strings x##x#x and xx###xx#xx, please define the desired sort order.
I think I can do this by sequential calls to the func I wrote, but I
could be wrong. I need more evidence to determine how to revise my
inadequate contribution thus far.
A.