renholmMedlem sedan apr. 20012 266 inlägg 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 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 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 Ä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 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 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 ok, ska kika på det... lycka till med golfen
renholmMedlem sedan apr. 20012 266 inlägg 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 Sorry om jag är tjatig men har ännu inte löst problemet, hur ska jag göra?