[SQL] If.. then.. else.. statement mogelijk?

Pagina: 1
Acties:
  • 269 views sinds 30-01-2008
  • Reageer

  • _Rob
  • Registratie: Januari 2003
  • Laatst online: 17-04 08:49
Ik probeer om vanuit een stored procedure een andere waarde naar een asp.net pagina te sturen dan die in het tabel staat. Met 'Case' is dit al gelukt maar dan komen de rijen waarvan ik wel wil dat de waarde te zien is leeg terug. Dat is dus niet mijn bedoeling. Is er zoiets als een If then else statement mogelijk die dit wel toelaat?

Hier mijn gebruikte SQL
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE PROCEDURE GetConKeuken

AS
SELECT
  KeukenId,
  KeukenNaam,
  Lengte,
  Afmeting,
  Kleur,
  Prijs As Value,
  Prijs = Case
  WHEN Consument = '0' Then 'Geen prijsopgave'
  END,
  Apparatuur,
  Omschrijving,
  Consument

FROM
  Keuken
GO


Alvast bedankt voor de hulp!

p.s.
Het is een MS 2000 SQL Server

[ Voor 10% gewijzigd door _Rob op 23-02-2004 16:35 ]

Webdeveloping... -counts to 10- Sigh...


  • Vae Victis
  • Registratie: April 2001
  • Laatst online: 25-05 21:56

Vae Victis

Dark Lord of the Sith

Wat voor database server heb je?
Bij mssql kan je bv dit doen:
Voorbeeld code uit helpfile.
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
USE pubs
GO
DECLARE @msg varchar(255)
IF (SELECT COUNT(price)
   FROM titles 
   WHERE title_id LIKE 'TC%' AND price BETWEEN 10 AND 20) > 0
   
   BEGIN
     SET NOCOUNT ON
     SET @msg = 'There are several books that are a good value between $10 and $20. These books are: '
         PRINT @msg
      SELECT title 
     FROM titles 
     WHERE title_id LIKE 'TC%' AND price BETWEEN 10 AND 20
   END
ELSE
   BEGIN
     SET NOCOUNT ON
     SET @msg = 'There are no books between $10 and $20. You might consider the following books that are under $10.'
         PRINT @msg
     SELECT title 
     FROM titles 
     WHERE title_id LIKE 'TC%' AND price < 10       
   END


syntax:
SQL:
1
2
3
4
IF Boolean_expression { sql_statement | statement_block } 
[ 
    ELSE 
    { sql_statement | statement_block } ]

[ Voor 19% gewijzigd door Vae Victis op 23-02-2004 16:32 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Je bent op de goeie weg met die CASE, maar je moet er gewoon nog een DEFAULT aanhangen, die dan gewoon de veldinhoud returned.

code:
1
2
3
SELECT val = CASE WHEN prijs = '0' THEN 'Geen prijsopgave'
                   ELSE prijs
FROM tabel

Zo ongeveer. 'k Heb het zelf niet getest enzo.

[ Voor 13% gewijzigd door whoami op 23-02-2004 16:46 ]

https://fgheysels.github.io/


  • __fred__
  • Registratie: November 2001
  • Laatst online: 24-05 22:44
IF, THEN, ELSE Constructies zijn nogal traag dus je kunt beter een UNION gebruiken om het resultaat te bereiken.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
SELECT
  KeukenId,
  KeukenNaam,
  Lengte,
  Afmeting,
  Kleur,
  Prijs As Value,
  Apparatuur,
  Omschrijving,
  Consument
FROM
  Keuken
WHERE Consument <> 0
UNION
SELECT
  KeukenId,
  KeukenNaam,
  Lengte,
  Afmeting,
  Kleur,
  'Geen Prijsopgave',
  Apparatuur,
  Omschrijving,
  Consument
FROM
  Keuken
WHERE Consument = 0


Aangezien union het niet toestaat om twee queries met verschillende datatypen te mergen is het misschien nodig om de eerste Prijs te converteren naar een string.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Hmm, ik ben er nog niet zo zeker van of een UNION sneller zal zijn.
En als je moet gaan converten, dan kan dat onaangename gevolgen hebben. Dan moet je aan de client-kant nog eens die VARCHARS naar numerieke data gaan omzetten.

[ Voor 56% gewijzigd door whoami op 23-02-2004 16:42 ]

https://fgheysels.github.io/


  • _Rob
  • Registratie: Januari 2003
  • Laatst online: 17-04 08:49
Bedankt allemaal voor de snelle reacties!

Ik ben er uit met de oplossing van __fred__
De andere oplossingen zal ik iig ook nog even proberen (en dit topic even in de favorieten zetten :))

Webdeveloping... -counts to 10- Sigh...


  • __fred__
  • Registratie: November 2001
  • Laatst online: 24-05 22:44
UNION is altijd sneller omdat die oplossing setbased opgelost kan worden, het wordt misschien een ander verhaal als je de resultaten erna nog wilt sorteren.
IF-THEN-ELSE wordt altijd rij voor rij uitgevoerd en dat maakt echt een factor 10-100 verschil.

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Een UNION zal ik dit geval nogal langzamer zijn dan een CASE WHEN oplossing. (misschien wel sneller dan een IF constructie). Hoe kom je erbij dat het niet meer setbased is als je een functie gebruikt?

Het best is in dit geval een case when te gegruiken:

code:
1
2
3
4
SELECT CASE Veld 
            WHEN waarde THEN iets 
            ELSE ietsanders END AS Foo
FROM Tabel

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 26-05 00:01

Janoz

Moderator Devschuur®

!litemod

__fred__ schreef op 23 februari 2004 @ 17:22:
UNION is altijd sneller omdat die oplossing setbased opgelost kan worden, het wordt misschien een ander verhaal als je de resultaten erna nog wilt sorteren.
IF-THEN-ELSE wordt altijd rij voor rij uitgevoerd en dat maakt echt een factor 10-100 verschil.
Twee gesorteerde lijsten samenvoegen Kan heel snel (O(n)), dus dat is niet zo'n probleem.


@probleem

Waarom wil je in de SP al view dingen gaan doen? IMHO hoort dit case statement niet in je SP, maar in je asp. Het enige dat ik me nog zou kunnen voorstellen is dat je een extra bit veld introduceerd die aangeeft of er wel of niet een prijsopgaaf is, maar zeker niet een veld dubbel gebruiken met een getal of een tekst en deze tekst ook nog uit een melding richting gebruiker te laten bestaan. Wat nu als je applicatie 2 talig moet worden of de melding aangepast zou moeten worden? Het uiterlijk van de applicatie moet zoveel mogenlijkgecentreerd worden bepaald. Dit komt de onderhoudbaarheid heel erg ten goede.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1