webForumDet fria alternativet

Är det möjligt att sortera detta i ren sql

Databaser & SQL

8 svar · 222 visningar · startad av erka

Medlem sedan dec. 19996 522 inlägg
Frågan#1

Hej jag hämtar ut ett par fält ifrån en databas och ska sortera dem på kolumnen DesignName som är av varchar, vi kan ta som jag har skrivit i denna sql fråga, hämta de med modelName 'b'.

SELECT     TOP 100 PERCENT dbo.Design.PKdesignID, dbo.Design.DesignName
FROM         dbo.Model INNER JOIN
                      dbo.Design ON dbo.Model.PKmodelID = dbo.Design.FKmodelID INNER JOIN
                      dbo.DesignVisibilityLink ON dbo.Design.PKdesignID = dbo.DesignVisibilityLink.PKdesignID
WHERE     (dbo.Model.ModelName = 'b') AND (dbo.DesignVisibilityLink.PKvisibilityID = 2)
ORDER BY dbo.Design.DesignName

Nu får jag ut exakt i denna ordningen
b10-2
b110
b15-2
b150
b20
b30-2
b40
b5
b50
b50-2

vilket är rätt givet då jag sorterar på bokstavsordning, finns det något sätt att direkt i sql frågan få att den sorterar med minst överst (jag kan inte ha talformat på kolumnen pågrund av vissa anledningar, så det går tyvärr inte att göra om den till int). Alltså så jag får ut

b5
b10-2
b15-2
b20

osv

Jag vet hur jag ska lösa det i presentationen men vore gutt att slippa det.

tack!

Medlem sedan dec. 200012 464 inlägg
#2

Hur ser datat ut? Är det alltid en bokstav först? Har det som står efter - någon betydelse? Om svaren är nej så

order by case when charindex('-',DesignName) > 0 then
  cast(substring(designName,2,charindex('-',DesignName)-1)
  as int 
  else cast(substring(designName,2,len(designName)-1) end
Medlem sedan dec. 19996 522 inlägg
#3

Tack Larsg,Ja det börjar alltid med bokstav och det som står efter - har inte någon sorterings betydelse.

Får inte din kod att funka i min storedprocedure, måste man inte skriva BEGIN och END, och inte använda THEN?

Medlem sedan dec. 200012 464 inlägg
#4

Jag skrev lite slarvigt

order by case when charindex('-',DesignName) > 0 then
  cast(substring(designName,2,charindex('-',DesignName)-1)
  as int) 
  else cast(substring(designName,2,len(designName)-1)  as int )end

Hur ser din kod ut och vad får du för felmeddelande?

Medlem sedan dec. 19996 522 inlägg
#5
CREATE PROCEDURE [spTest]
@visibility int,
@strPrior varchar(100)
 
AS

SELECT     TOP 100 PERCENT dbo.Design.PKdesignID, dbo.Design.DesignName
FROM         dbo.Model INNER JOIN
                      dbo.Design ON dbo.Model.PKmodelID = dbo.Design.FKmodelID INNER JOIN
                      dbo.DesignVisibilityLink ON dbo.Design.PKdesignID = dbo.DesignVisibilityLink.PKdesignID
WHERE     (dbo.Model.ModelName = @strPrior) AND (dbo.DesignVisibilityLink.PKvisibilityID = @visibility)
ORDER BY dbo.Design.DesignName ASC

GO

så fungerar det men det blir ej rätt sortering som jag beskrev ovan, använder jag din kod får jag felmeddelandet

Syntax error converting the varchar value '10-' to a column of data type int

Soteringen kanske man får glömma då, men du kanske kan ge mig ett tipps på hur jag loopar igenom en sträng i en sp efter punkter och räknar antalet punkter i strängen.

Nu använder jag tex
Set @IntPos = CHARINDEX('.',@strSubString,0)

för att kolla positionen på den första punkten i @strSubstring

Sorteringen var mer av en bonus, det verkar vara struligt att få den att fungera iaf. :) Tack för din hjälp iaf!

Medlem sedan dec. 200012 464 inlägg
#6

Då verkar det bara som jag har en position fel i sorteringen

order by case when charindex('-',DesignName) > 0 then
  cast(substring(designName,2,charindex('-',DesignName)-2)
  as int) 
  else cast(substring(designName,2,len(designName)-1)  as int )end

För att få fram antal punkter i en sträng:

set @points = len(@strSubString) - len(replace(@strSubString,'.',''))

Om du absolut vill ha en loop så går det väl ;)

Medlem sedan dec. 19996 522 inlägg
#7

Passar på loopen då :e, tack.

ORDER BY case WHEN charindex('-',DesignName) > 0 THEN
Cast(substring(designName,2,charindex('-',DesignName)-2) as int) 
ELSE
Cast(substring(designName,2,len(designName)-1) as int)
END

går bra på den första gruppen som loopas igenom, den med b namnen, När den kommer till nästa som innehåller

b15Mf
b20Mf
b20Mf-m
b30Mf
b30Mf-m

osv får jag

Syntax error converting the varchar value '15MF' to a column of data type int.

ändrar jag det till från att vara int till varchar i spn (i sorteringen) så blir det ju ingen sortering som förklarligt. Det verkar vara crux så man kanske ska skita i det ;) Tack för hjälpen iaf.

Medlem sedan dec. 200012 464 inlägg
#8

Jaha, som vanligt så får man inte veta alla förutsättningar ;)

Det går väl att få till om du skriver en funktion som bara kollar om det är numeriska värden

create function jerka (@str varchar(200))
as
declare @p int, @s int, @e int,@l int
declare @c char

set @l = len(@str)
set @s = -1
set @p = 1
while @p <= @l
begin
    set @c = substring(@str,@p,1)
    if  @c between '0' and '9' 
    begin
         if  @s = -1 set @s = @p
         set @e = @p
    end
    set @p = @p + 1
end
if  @s < 0 return 99999999
return cast(substring(@str,@s,@e-@s+1) as int

och sen så

order by jerka(designname)
Medlem sedan dec. 19996 522 inlägg
#9

jerka, jävla erka :e tack ska prova med den sissta funktionen, funkar inte den så ger jag mig. Stort tack, tänkte att det hade blivit lite jobbigt att posta 800 olika modellnamn här, eftersom de är uppbyggda av blandade siffror och tal tänkte jag att det kunde finnas någon generell sorterings möjligthet, ber om ursäkt :)

danke!

286 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
154 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)