[sql server] 0 ipv null, 1 ipv de rest

Pagina: 1
Acties:

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 21:21
Hallo,

Ik heb momenteel een query waarbij personen uit de database worden gehaald en waaraan een tabel is gekoppeld met ziekmeldingen. Een persoon kan uiteraard ziek zijn.

Nu wil ik dat zodra het ziekmeldingid meer dan 0 is, het getal 1 wordt teruggegeven. Zodra het ziekmelding-id 0 is wordt er null teruggegeven, omdat het een left join betreft. Ik wil dat er in dat geval 0 wordt teruggegeven ipv null. Nu heb ik dat al op vele manieren geprobeerd maar tot nu toe zonder succes. Daarbij helpen de view designer en de query analyzer van sql server mij niet echt, omdat de ene bepaalde syntax wel accepteert en de andere niet. Met bijvoorbeeld case kom ik er niet uit want die mag niet in de view designer gebruikt worden.

Ik heb al veel gezocht maar het zijn wel lastige zoektermen. Weet een sql goeroe (of iemand anders) misschien een hint in de goede richting?

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Kijk in Books online naar:
ISNULL()
en
CASE

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 21:21
EfBe schreef op maandag 20 juni 2005 @ 09:33:
Kijk in Books online naar:
ISNULL()
en
CASE
Het zou leuk zijn als je de topicstart leest voordat je reageert :). Die functies die je noemt ken ik ook wel.

[ Voor 9% gewijzigd door Dennis op 20-06-2005 09:35 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 06-05 15:36
Je zal het toch met een CASE moeten doen.
Volgens mij mag je CASE toch wel degelijk gebruiken in een View. Dat het niet werkt in de view-designer wil volgens mij niets zeggen, dan maak je je view maar mbhv t-sql.

https://fgheysels.github.io/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-05 14:03

curry684

left part of the evil twins

Dennis schreef op maandag 20 juni 2005 @ 09:35:
[...]

Het zou leuk zijn als je de topicstart leest voordat je reageert :). Die functies die je noemt ken ik ook wel.
ISNULL en CASE zijn anders echt de enige manieren om dit op te lossen, en als je ze kent vraag ik me af waarom je ze in hemelsnaam niet gebruikt :)

Sowieso lelijke construct trouwens om dat ziekmelding-ID naar 0 te vertalen en daarmee je data te corrumperen. Laat de applicatie gewoon lekker de null afvangen, dat klopt functioneel tenminste.

Professionele website nodig?


Verwijderd

In SQL ...

UPDATE table_name SET column_name = 0 WHERE column_name IS NULL

UPDATE table_name SET column_name = 1 WHERE column_name <> 0

(wel in die volgorde uitvoeren natuurlijk)

of is het niet om een bestaande database input te wijzigen ?

[ Voor 17% gewijzigd door Verwijderd op 20-06-2005 10:40 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 06-05 15:36
Verwijderd schreef op maandag 20 juni 2005 @ 10:39:
In SQL ...

UPDATE table_name SET column_name = 0 WHERE column_name IS NULL

UPDATE table_name SET column_name = 1 WHERE column_name <> 0

(wel in die volgorde uitvoeren natuurlijk)

of is het niet om een bestaande database input te wijzigen ?
Dat is helemaal niet de vraag; het gaat erom om de data die gedisplayed wordt aan te passen.
Waardes van niet bestaande records kan je niet aanpassen.

https://fgheysels.github.io/


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Verwijderd schreef op maandag 20 juni 2005 @ 10:39:
In SQL ...

UPDATE table_name SET column_name = 0 WHERE column_name IS NULL

UPDATE table_name SET column_name = 1 WHERE column_name <> 0

(wel in die volgorde uitvoeren natuurlijk)
?

NULLS zijn niet verkeerd in een database! Waarom zou je die willen updaten? In dit geval is het ook niet relevant, het gaat om een LEFT JOIN die soms geen resultaten geeft, en dus een NULL retourneert. Die NULL wil TS graag afvangen.

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


Verwijderd

Excuseer ik had het compleet verkeerd voor ...
ik dacht gewoon dat hij in de database alle velden met NULL -> 0 wilde maken
en al de andere met een waarde op 1 te zetten ...
vond het al bizar dat zo'n eenvoudige vraag zo lang aansleepte :)

ik zou dit eerder door een programmeertaal laten opvangen, dan door SQL
maar ik weet niet of dat hier mogelijk is ...

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 21:21
De null vervangen door 0 is trouwens niet echt het probleem want dat is vrij gemakkelijk met de ISNULL functie. Het vervangen van alle andere waarden door 1 is een stuk lastiger. Dat zal inderdaad met een if of case moeten zoals curry al zei.

  • vinnux
  • Registratie: Maart 2001
  • Niet online
Zoiets?

SELECT 'Price Category' =
CASE
WHEN price IS NULL THEN 'Not yet priced'
WHEN price < 10 THEN 'Very Reasonable Title'
WHEN price >= 10 and price < 20 THEN 'Coffee Table Title'
ELSE 'Expensive book!'
END,
CAST(title AS varchar(20)) AS 'Shortened Title'
FROM titles
ORDER BY price
GO

Verwijderd

-- hmm, nvm --
whoami schreef op maandag 20 juni 2005 @ 11:39:
[...]


wat is dat nu voor een onzinnige (en niet werkende) query ?
Het gaat hier om SQL Server en niet om MySQL.
Zo onzinnig en niet-werkend is de query niet :|. Had alleen ff gemist dat het over ms sql ging.

[ Voor 255% gewijzigd door Verwijderd op 20-06-2005 11:46 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 06-05 15:36
Verwijderd schreef op maandag 20 juni 2005 @ 11:38:
SELECT field IS NOT NULL AS bool FROM table
wat is dat nu voor een onzinnige (en niet werkende) query ?
Het gaat hier om SQL Server en niet om MySQL.

[ Voor 11% gewijzigd door whoami op 20-06-2005 11:39 ]

https://fgheysels.github.io/


  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 21:21
Nouja inmiddels is het gelukt met de SQL server view designer. Ik mag best een case gebruiken in mijn query, maar dan kan ik niet meer die veldjes wijzigen op de grafische methode. Gelukkig deed ik dat toch al niet dus maakt het weinig meer uit.

Ik gebruik nu gewoon:

code:
1
2
3
4
5
6
7
8
9
10
SELECT
    e.FirstName, 
    e.MiddleName, 
    E.LastName, 
    CASE
        WHEN (s.Id IS NULL) THEN 0
    ELSE
        1
    END,
    DAY(CURRENT_TIMESTAMP - s.RegistrationDate) - 1


Iedereen bedankt voor de reacties!

[ Voor 5% gewijzigd door Dennis op 20-06-2005 11:47 ]


Verwijderd

Dennis schreef op maandag 20 juni 2005 @ 11:46:
Nouja inmiddels is het gelukt met de SQL server view designer. Ik mag best een case gebruiken in mijn query, maar dan kan ik niet meer die veldjes wijzigen op de grafische methode. Gelukkig deed ik dat toch al niet dus maakt het weinig meer uit.

Ik gebruik nu gewoon:

code:
1
2
3
4
5
6
7
8
9
10
SELECT
    e.FirstName, 
    e.MiddleName, 
    E.LastName, 
    CASE
        WHEN (s.Id IS NULL) THEN 0
    ELSE
        1
    END,
    DAY(CURRENT_TIMESTAMP - s.RegistrationDate) - 1


Iedereen bedankt voor de reacties!
Ben niet zo bekend met ms sql, maar kun je er geen NOT (s.Id IS NULL) of !(s.Id IS NULL) van maken?

--edit--

code:
1
2
3
4
5
6
SELECT
    e.FirstName, 
    e.MiddleName, 
    E.LastName, 
    ((s.Id IS NOT NULL) * -1),
    DAY(CURRENT_TIMESTAMP - s.RegistrationDate) - 1


lijkt mij persoonlijk een mooiere oplossing (werkt @ ms access)

[ Voor 14% gewijzigd door Verwijderd op 20-06-2005 11:55 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Verwijderd schreef op maandag 20 juni 2005 @ 11:49:
[...]


Ben niet zo bekend met ms sql, maar kun je er geen NOT (s.Id IS NULL) of !(s.Id IS NULL) van maken?
Wat wil je daarmee bereiken dan? SQL Server kent trouwens geen boolean datatype.

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


  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
coalesce is wat je zoekt

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Nee hoor, het antwoord wat hij zoek (CASE) is al lang gegeven. COALESCE retourneert slechts de eerste niet null in zijn argumenten, daar heb je in dit geval niets aan.

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


Verwijderd

Dennis schreef op maandag 20 juni 2005 @ 11:46:
code:
1
2
3
4
5
6
7
8
9
10
SELECT
    e.FirstName, 
    e.MiddleName, 
    E.LastName, 
    CASE
        WHEN (s.Id IS NULL) THEN 0
    ELSE
        1
    END,
    DAY(CURRENT_TIMESTAMP - s.RegistrationDate) - 1
SQL-Alternatief:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
    e.FirstName, 
    e.MiddleName, 
    E.LastName, 
    0 AS Ziekmelding
    DAY(CURRENT_TIMESTAMP - s.RegistrationDate) - 1
    ...
    WHERE s.id=NULL
    UNION ALL
    e.FirstName, 
    e.MiddleName, 
    E.LastName, 
    1 AS Ziekmelding
    DAY(CURRENT_TIMESTAMP - s.RegistrationDate) - 1
    ...
    WHERE s.id IS NOT NULL
Pagina: 1