---
title: "Sortera efter flera fält med case"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/122494-sortera-efter-flera-fält-med-case"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "Glitter"
published: "2005-02-15T10:15:00.000Z"
updated: "2005-02-16T12:50:36.000Z"
replies: 20
views: 579
page: 1
pages: 2
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/122494-sortera-efter-flera-fält-med-case"
---

# Sortera efter flera fält med case

_Sida 1 av 2._

## #1 — Glitter, 2005-02-15T10:15Z

Hej

Jar har en SQL fråga:
SELECT     \*
FROM        karta
WHERE     (forsamlingskod IS NULL)
ORDER BY lankod, CASE WHEN kommunkod IS NOT NULL THEN 1 ELSE 0 END, Namn

Funkar nästan bra...
Denna sorterar efter kommuner i bokstavsårdning efter länen men jag vill ha länen i bokstavsårdning med.
just nu är de sorterade i lankod.

Man vet att det är ett län p.g att kommunkod är null. kommunkod innehåller värde på både lankod och kommunkod.

Kör SQL 2000 Server

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

## #2 — toha, 2005-02-15T10:24Z

Hmm, är det inte bara att ta bort "lankod" i ORDER BY?

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

## #3 — Glitter, 2005-02-15T10:25Z

nepp då får jag alla län överst...

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

## #4 — LarsG, 2005-02-15T10:41Z

Var har du länsnamn lagrade då?

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

## #5 — Glitter, 2005-02-15T10:48Z

länsnamnen ligger i namn columnen tilsammans med kommun namnen...

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

## #6 — toha, 2005-02-15T11:07Z

Hur blir det om du gör nåt sånt här?

```
SELECT
	lankod,
	lan.namn		AS LanNamn,
	kommunkod,
	namn			AS KommunNamn
FROM
	karta
	inner join
	karta lan
	ON
	lan.lankod = karta.lankod
	and
	karta.kommunkod IS NULL
WHERE
	forsamlingskod IS NULL

ORDER BY
	LanNamn,
	CASE WHEN kommunkod IS NOT NULL THEN 1 ELSE 0 END,
	KommunNamn
```

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

## #7 — Glitter, 2005-02-15T12:09Z

asså det är samma tabell som alt ligger i...

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

## #8 — LarsG, 2005-02-15T12:12Z

Vad betyder tillsammans med?

Kan du exemplifiera med datainnehåll?

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

## #9 — toha, 2005-02-15T12:25Z

> asså det är samma tabell som alt ligger i...

Jo, men om du ser så är lan-tabellen bara en alias; en inner join med sig själv för att få med lännamn för resp. kommun.

```
FROM
	karta
	inner join
	[b]karta lan[/b]
	ON
	lan.lankod = karta.lankod
	and
	karta.kommunkod IS NULL
```

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

## #10 — Glitter, 2005-02-15T13:24Z

toha: det går inte får massa dubletter...

> **LarsG skrev:**
>
> Vad betyder tillsammans med?
> 
> Kan du exemplifiera med datainnehåll?

```
Namn                 |Kommunkod|Lankod
STOCKHOLMS LÄN       |NULL     |1
BOTKYRKA             |27       |1
DANDERYD             |62       |1
VÄSTRA GÖTALANDS LÄN |NULL     |14
ALE                  |40       |14
ALINGSÅS             |89       |14
```

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

## #11 — Jesper T, 2005-02-15T14:03Z

```
SELECT
	distinct(lankod) ,
...
```

?

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

## #12 — Glitter, 2005-02-15T14:34Z

Går inte eftersom kommunkod innehåller samma lankod som länet som de ligger under

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

## #13 — toha, 2005-02-15T14:55Z

Den här då? :)

```
SELECT
	lan.lankod,
	lan.namn			AS LanNamn,
	karta.kommunkod,
	karta.namn			AS KommunNamn
FROM
	karta

	LEFT OUTER JOIN
	karta lan
	ON
	lan.lankod = karta.lankod
	and
	lan.kommunkod IS NULL

WHERE
	karta.kommunkod IS NOT NULL

UNION

SELECT
	karta.lankod,
	karta.namn,
	null,
	null
FROM
	karta
WHERE
	karta.kommunkod IS NULL

ORDER BY
	LanNamn,
	KommunNamn
```

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

## #14 — Glitter, 2005-02-15T15:17Z

Det funkar ju men blir det inte onödligt mycket information och segt? 
Skall vara så optimalt som möjligt.
Annars så kan jag sätta 2 loppar i varandra för att loppa ut det på sidan som jag gjorde från början.

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

## #15 — toha, 2005-02-15T15:26Z

Det går ju garanterat snabbare att låta databasen returnera det korrekt än att loopa igenom ett resultat och villkorskontrollera varje rad.

Vad har du för index på tabellen?

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

## #16 — Glitter, 2005-02-15T15:55Z

inga i nuläget... men skall fixa det så småningom...
några förslag på indexering för bästa resultat?

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

## #17 — toha, 2005-02-15T16:10Z

Med det uttrycket så tror jag det ska räcka om du skapar ETT kombinerat index på kolumnerna:

kommunkod,
lankod,
namn

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

## #18 — toha, 2005-02-15T16:12Z

En liten rättning i uttrycket: Kör en UNION ALL, blir lite snabbare så om du är orolig för prestandan. Funkar i det här fallet.

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

## #19 — Glitter, 2005-02-16T09:21Z

Hur gör man denna till en view i databasen? 
För det är la det bästa sättet för prestanda om det inte skall ändras något i databasen och uthämtningen?
får fel på ORDER BY och Union mär jag skall spara...

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

## #20 — toha, 2005-02-16T10:17Z

Du tjänar ingen prestanda på att skapa en vy av det. I en vy kan man inte ange ORDER BY. Det får man göra när man gör en select utifrån vyn. Jag skulle skapat en SP för det.

```
CREATE PROCEDURE proc_getLanKommunOrdered
AS

    SELECT ........

GO
```

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

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/122494-sortera-efter-flera-fält-med-case  
Nästa sida: https://www.webforum.nu/amne/databaser-sql/122494-sortera-efter-flera-fält-med-case/page2.md
