---
title: "Är det möjligt att sortera detta i ren sql"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/45333-är-det-möjligt-att-sortera-detta-i-ren-sql"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "erka"
published: "2002-06-06T07:58:50.000Z"
updated: "2002-06-06T11:59:27.000Z"
replies: 8
views: 236
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/45333-är-det-möjligt-att-sortera-detta-i-ren-sql"
---

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

## #1 — erka, 2002-06-06T07:58Z

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!

Permalänk: https://www.webforum.nu/p/45333

## #2 — LarsG, 2002-06-06T10:57Z

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
```

Permalänk: https://www.webforum.nu/p/690460

## #3 — erka, 2002-06-06T11:03Z

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?

Permalänk: https://www.webforum.nu/p/690465

## #4 — LarsG, 2002-06-06T11:20Z

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?

Permalänk: https://www.webforum.nu/p/690471

## #5 — erka, 2002-06-06T11:30Z

```
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!

Permalänk: https://www.webforum.nu/p/690478

## #6 — LarsG, 2002-06-06T11:38Z

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 ;)

Permalänk: https://www.webforum.nu/p/690482

## #7 — erka, 2002-06-06T11:46Z

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.

Permalänk: https://www.webforum.nu/p/690487

## #8 — LarsG, 2002-06-06T11:57Z

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)
```

Permalänk: https://www.webforum.nu/p/690497

## #9 — erka, 2002-06-06T11:59Z

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!

Permalänk: https://www.webforum.nu/p/690500

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/45333-är-det-möjligt-att-sortera-detta-i-ren-sql
