webForumDet fria alternativet

Sorteringsproblem

8 svar · 288 visningar · startad av renholm

renholmMedlem sedan apr. 20012 266 inlägg
#1

Har problem med sortering av fält innehållandes både bokstäver och siffror. Detta blir resultatet som jag inte är nöjd med:

	file_id	file_name	file_catid

	29	GC1	12
	39	GC10	12
	112	GC100	12
	117	GC105	12
	118	GC106	12
	119	GC106	12
	120	GC107	12
	121	GC108	12
	122	GC109	12
	136	GC11	12
	123	GC110	12
	124	GC113	12
	125	GC114	12
	126	GC117	12
	40	GC12	12
	41	GC14	12

SQL:

ORDER BY file_name

Jag vill ha så att den sorterar i nummer följd och ignorerar vilka bokstäver som står före. Resultatet bör bli något i stil med:

	file_id	file_name	file_catid

	29	GC1	12
	31	GC2	12
	32	GC3	12
	33	GC4	12
	34	GC5	12
	35	GC6	12
	36	GC7	12
	37	GC8	12
	38	GC9	12
	39	GC10	12
	112	GC100	12
	117	GC105	12
	118	GC106	12
	119	GC106	12
	120	GC107	12
	121	GC108	12
	122	GC109	12
LarsGMedlem sedan dec. 200012 464 inlägg
#2

Det går om det finns en systematik i filnamnen.

Är det alltid lika många inledande bokstäver?
Slutar alla filnamn med numeriska värden?

-- om 1 är sant och de två första tecknen är bokstäver
order by cast(substring(file_name,3,len(file_name)-2) as int)

-- om 2 är sant

order by cast(substring(file_name,patindex('[0-9]',file_name),
                       len(file_name)-patindex('[0-9]',file_name)+1) as int)

Koden är specifik för sql server

renholmMedlem sedan apr. 20012 266 inlägg
#3

False!

Tyvärr så är inget sant, det är det som gör det klurigt, resultaten visas efter vilket catid de har, så vissa kategorier har t.ex "GC123" och andra kan heta "Så det kan gå".

LarsGMedlem sedan dec. 200012 464 inlägg
#4

Är alla siffror sammanhängande eller kan det finnas namn som

A123B456 ?

Och i så fall hur skall dom sorteras?

Om du använder sql server 2000 så går det att skriva en funktion som tittar på varje tecken och plockar ut alla siffror

create function analyzeThis(@file_name varchar(30))
returns int as 
declare @number,@p int
declare @c char
set @number = 0
set @p = 1
while @p <= len(@file_name)
begin
   set @c = substring(@file_name,@p,1) 
   if @c between '0' and '9'
      set @number = 10*@number + cast(@c as int)
   set @p = @p + 1
end 
if @number = 0 set @number = 9999999
return @number
order by analyzeThis(file_name)
renholmMedlem sedan apr. 20012 266 inlägg
#5

ok, för antingen är file_name = BokstäverSiffror eller bara bokstäver, och den ska sortera efter siffrorna i slutet när filnamnet slutar med siffro t.ex BG0145. De kommer aldrig heta t.ex DV012BN2. Om det är bara bokstäver så ska den bara sortera i bokstabsordning.

Jag använder MS SQL Server 2000, men ska jag lägga din function i User Defined Functions?

LarsGMedlem sedan dec. 200012 464 inlägg
#6

om du vill ha sortering enligt bokstavsordning på de utan bokstäver så behöver du lägga till

order by analyzeThis(filename),filename

Om alla siffror är sammanhämgande så går det att göra utan en funktion. (Har inte tid nu har starttid 14.17 på golfbanan. Man kan plocka ihop det med funktionerna substring patindex cast och reverse.)

renholmMedlem sedan apr. 20012 266 inlägg
#7

ok, ska kika på det... lycka till med golfen

renholmMedlem sedan apr. 20012 266 inlägg
#8

Hum, nu har jag kikat på det och kommit fram till att din funktion inte fungerade... har jag gjort fel? Jag la den i User Defined Functions. Men blev syntax error.

renholmMedlem sedan apr. 20012 266 inlägg
#9

Sorry om jag är tjatig men har ännu inte löst problemet, hur ska jag göra?

141 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)