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.
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
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?
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!
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,'.',''))
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.
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
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!
256 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9