[MSSQL2005] Case gebruiken in een where clause

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05 12:10
Goedemiddag allemaal,

Ik heb een uitdaging (voor mij dan iig)
Ik heb een SP waarin ik een select heb zitten
als parameter van de sp heb ik onderandere @isActive deze wordt gevuld met een waarde van een checkbox als ik de SP aanroep nu komt het mooie

als ik even een simpel voor beeld schets.

Ik heb een tabel genaamd parts
in die tabel zitten heeeeeel veeeeeel parts
in de tabel zit een veld genaamd active welke 1 of 0 kan aannemen
ik wil nu in mijn FE door middel van het zetten van de checkbox de query aanpassen
dus als ik een vinkje zet moet hij alleen alle actieve parts tonen uit de tabel parts
nu dacht ik zelf even slim te zijn en had ik dus deze code

SQL:
1
2
3
4
DECLARE @isActive INT
SELECT @isActive = 1

SELECT * FROM tbl_Parts WHERE CASE WHEN @isActive = 1 THEN tbl_Parts.active = 1


als ik deze code run krijg ik een melding
code:
1
2
Msg 102, Level 15, State 1, Line 9
Incorrect syntax near '='.


ik vraag me dus af hoe ik aan de hand van de variabele die opgegeven wordt ik een bepaald stuk van mijn query wel of niet kan uitvoeren... Ik heb al gezocht op google maar kan helemaal niets vinden hierover...

Hoop dat iemand opheldering kan geven.

iRacing Profiel


Acties:
  • 0 Henk 'm!

  • pasz
  • Registratie: Februari 2000
  • Laatst online: 01-09 23:08
Kan je de definitie van je tbl_Parts tabel even laten ziet.

Waarom geen :
SQL:
1
SELECT * FROM tbl_Parts WHERE tbl_Parts.active =  @isActive

[ Voor 3% gewijzigd door pasz op 09-01-2009 13:07 ]

woei!


Acties:
  • 0 Henk 'm!

  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05 12:10
pasz schreef op vrijdag 09 januari 2009 @ 13:07:
Kan je de definitie van je tbl_Parts tabel even laten ziet.

Waarom geen :
SQL:
1
SELECT * FROM tbl_Parts WHERE tbl_Parts.active =  @isActive
Als @isActive 0 is dan wil ik eigenlijk die hele where niet uitvoeren of in dit geval zeggen active = 1 and active = 0 zodat ik alle parts terug krijg.

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
25
26
27
28
CREATE TABLE [dbo].[tbl_parts](
    [RecordID] [int] IDENTITY(1,1) NOT NULL,
    [oem_id] [nchar](2) NOT NULL,
    [Partnummer] [nvarchar](50) NOT NULL,
    [Description] [nvarchar](200) NOT NULL,
    [discontinued] [bit] NULL CONSTRAINT [DF_tbl_parts_discontinued]  DEFAULT (0),
    [active] [bit] NOT NULL CONSTRAINT [DF_tbl_parts_active]  DEFAULT (1),
    [AutoOtv] [bit] NOT NULL CONSTRAINT [DF_tbl_parts_AutoOtv]  DEFAULT (0),
    [RTV_Source] [numeric](18, 0) NULL,
    [Current_Work_Stock] [int] NULL,
    [Min_Work_Stock] [int] NULL,
    [Part_Location] [nvarchar](5) NULL,
    [Created] [datetime] NULL CONSTRAINT [DF_tbl_parts_created]  DEFAULT (getdate()),
    [SN_Scan] [bit] NOT NULL CONSTRAINT [DF_tbl_parts_SN_Scan]  DEFAULT (1),
    [SN_Min_Char] [int] NOT NULL CONSTRAINT [DF_tbl_parts_SN_Min_Char]  DEFAULT (0),
    [SN_Max_Char] [int] NOT NULL CONSTRAINT [DF_tbl_parts_SN_Max_Char]  DEFAULT (0),
    [SN_Image] [nvarchar](200) NULL,
    [SNScan] [char](50) NULL,
    [Coo_Scan] [bit] NOT NULL CONSTRAINT [DF_tbl_parts_CoOScan]  DEFAULT (0),
    [Extra_String] [nvarchar](50) NULL,
    [Part_request_Max_1] [bit] NOT NULL CONSTRAINT [DF_tbl_parts_Part_request_Max_1]  DEFAULT (1),
    [part_categorie_id] [int] NOT NULL,
 CONSTRAINT [PK_tbl_parts] PRIMARY KEY CLUSTERED 
(
    [oem_id] ASC,
    [Partnummer] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

[ Voor 63% gewijzigd door jvaneijk op 09-01-2009 13:17 ]

iRacing Profiel


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
idd, gewoon een simpele where clause gebruiken.

Case levert values op, dus die moet je weer vergelijken met een value, wat jij doet is een table field zetten wat natuurlijk niet kan.
jvaneijk schreef op vrijdag 09 januari 2009 @ 13:13:
[...]


Als @isActive 0 is dan wil ik eigenlijk die hele where niet uitvoeren of in dit geval zeggen active = 1 and active = 0 zodat ik alle parts terug krijg.
Dan heb je 3-states in je checkbox:
- ALLE parts
- Alleen de inactive
- Alleen de active

Een simpele checkbox is dan dus niet voldoende.

[ Voor 53% gewijzigd door EfBe op 09-01-2009 13:16 ]

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


Acties:
  • 0 Henk 'm!

  • dominic
  • Registratie: Juli 2000
  • Laatst online: 14-09 14:42

dominic

will code for food

jvaneijk schreef op vrijdag 09 januari 2009 @ 13:13:
[...]


Als @isActive 0 is dan wil ik eigenlijk die hele where niet uitvoeren of in dit geval zeggen active = 1 and active = 0 zodat ik alle parts terug krijg.
code:
1
2
3
4
5
6
DECLARE @isActive INT 
SELECT @isActive = 1 

SELECT * 
FROM tbl_Parts 
WHERE ((@isActive = 1 and tbl_Parts.active = 1) OR (@isActive = 0))


Basis true/false statements :s

[ Voor 3% gewijzigd door dominic op 09-01-2009 13:17 ]

Download my music on SoundCloud


Acties:
  • 0 Henk 'm!

  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05 12:10
dominic schreef op vrijdag 09 januari 2009 @ 13:16:
[...]


code:
1
2
3
4
5
6
DECLARE @isActive INT 
SELECT @isActive = 1 

SELECT * 
FROM tbl_Parts 
WHERE ((@isActive = 1 and tbl_Parts.active = 1) OR (@isActive = 0))


Basis true/false statements :s
Zege voor je oplossing.. Was ik zo snel niet op gekomen :D

iRacing Profiel


Acties:
  • 0 Henk 'm!

  • dominic
  • Registratie: Juli 2000
  • Laatst online: 14-09 14:42

dominic

will code for food

jvaneijk schreef op vrijdag 09 januari 2009 @ 13:22:
[...]


Zege voor je oplossing.. Was ik zo snel niet op gekomen :D
WHERE valt ook als WHEN te gebruiken als je begrijpt wat ik bedoel ;) M.a.w., SQL geeft alleen het record terug als de complete statement achter de where clause true is, en in zo'n where-statement kun je gewoon van alles en nog wat proppen ;)

Download my music on SoundCloud


Acties:
  • 0 Henk 'm!

  • winkbrace
  • Registratie: Augustus 2008
  • Laatst online: 24-08 15:17
Volgens mij mis ik een END aan het eind van je CASE statement. Vlak voor de = 1... ;)

Acties:
  • 0 Henk 'm!

  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05 12:10
BazzPsychoNut schreef op vrijdag 09 januari 2009 @ 14:28:
Volgens mij mis ik een END aan het eind van je CASE statement. Vlak voor de = 1... ;)
Ja dat kan wel kloppen.. Was geen copy paste van de het origineel maar even iets uit mijn hoofd gedaan.. In het oorspronkelijk bedoelde statement stondwel een end :)

iRacing Profiel

Pagina: 1