Ich habe eine Abfrage, in der ich Ergebnisse von einer Tabelle abrufen muss, abhängig von den Parametern, die vom Benutzer auf einer vb.net-Seite angegeben werden. Die Deklaration einer Variablen wäre die ideale Lösung, aber da es sich um eine Inline-Tabellenwertfunktion handelt, konnte ich dies nicht tun, ich hatte zu anderen Fragen gelesen, dass dies in einer Multistatment-Tabellenfunktion möglich ist, aber dass die Verwendung von Diese Funktion wird nicht empfohlen.CASE innerhalb WHERE Klausel
Die folgende Abfrage wäre die ideale Lösung oder das, was ich erreichen möchte.
USE [AUDIT]
GO
ALTER FUNCTION [dbo].[GetCreated_LPA_Audits]
(
@fechaInicio nvarchar (max),
@fechaFin nvarchar (max)
@Period int,
@Fecha int
)
RETURNS TABLE
AS
RETURN
(
SELECT T1.Plant,T1.Area,T1.Location,T1.IDAudit,T1.Auditor,T1.AuditDate,T1.DueDate,T1.CreationDate
FROM Header AS T1 inner join Audits AS T2 ON T1.IDChecklist = T2.IDChecklist
inner join AuditGroups AS T3 ON T2.IDGroup = T3.IDGroup
WHERE T3.IDGroup = '2' and CreationDate is not null AND
CASE WHEN @Periodo = '0' THEN CreationDate>= @fechaInicio
WHEN @Periodo = '1' THEN DATEPART(MONTH,CreationDate)>= @Fecha
WHEN @Periodo = '2' THEN
CASE WHEN @Fecha = 13 THEN
DATEPART(MONTH,CreationDate)>= 1
END
WHEN @Periodo = '2' THEN
CASE WHEN @Fecha = 14 THEN
DATEPART(MONTH,CreationDate)>= 7
END
WHEN @Periodo = '3' THEN
CASE WHEN @Fecha = 15 THEN
DATEPART(Year,CreationDate)>= 2015
END
END
AND
CASE WHEN @Periodo = '0' THEN @fechaInicio<=CreationDate
WHEN @Periodo = '1' THEN @Fecha<=DATEPART(MONTH,CreationDate)
WHEN @Periodo = '2' THEN
CASE WHEN @Fecha = 13 THEN
6<=DATEPART(MONTH,CreationDate)
END
WHEN @Periodo = '2' THEN
CASE WHEN @Fecha = 14 THEN
12<=DATEPART(MONTH,CreationDate)
END
WHEN @Periodo = '3' THEN
CASE WHEN @Fecha = 15 THEN
DATEPART(Year,CreationDate)>= 2015
END
END
UND In der vorherige Abfrage @fechaInicio, @fechaFin, @Periodo und @Fecha Parameter durch den Benutzer zur Verfügung gestellt werden.
Grundsätzlich, wenn @Periodo = 0
Ich brauche die Ergebnisse zu bekommen, wo CreationDate>= @fechaInicio and CreationDate<[email protected]
Wenn @Periodo = 1
ich die Ergebnisse erhalten müssen, wo DATEPART(MONTH,CreationDate)>= @Fecha and DATEPART(MONTH,CreationDate)<= @Fecha
Und so weiter. Hoffe, ich machte mich klar, danke im Voraus!
EDIT mit Pseudo-Code von @MatBailie, mit einigen slights Änderungen und Antworten auf seine Fragen
IF @periodo = '0' THEN
WHERE CreationDate >= @fechaInicio -- Copied from 1st CASE
AND @fechaFin <= CreationDate -- Copied from 2nd CASE
-- gets results from @fechaInicio to @fechaFin
-- i.e. results from 04/05/2016 to 04/16/2016
IF @periodo = '1' THEN
WHERE DATEPART(MONTH,CreationDate) >= @Fecha -- Copied from 1st CASE
AND @Fecha <= DATEPART(MONTH,CreationDate) -- Copied from 2nd CASE
-- In these case both conditions are the same 'cause
-- @Fecha is the number of a month (1 - 12)
-- i.e. @Fecha = 3 will get all the results of March
-- regardless of what it is on @fechaInicio and @fechaFin
IF @periodo = '2' THEN
IF @fetcha = 13 THEN
WHERE DATEPART(MONTH,CreationDate)>= 1 -- Copied from 1st CASE
AND 6<=DATEPART(MONTH,CreationDate) -- Copied from 2nd CASE
IF @fetcha = 14 THEN
WHERE DATEPART(MONTH,CreationDate)>= 7 -- Copied from 1st CASE
AND 12<=DATEPART(MONTH,CreationDate) -- Copied from 2nd CASE
-- You never use @fetchaInicio?
-- You want everything in the first 6 months or last 6 months
-- For every year
-- Regardless of what is in @fetchaInicio?
-- Exactly!!--
IF @periodo = '3' THEN
IF @fetcha = 15 THEN
WHERE DATEPART(Year,CreationDate)>= 2015 -- Copied from 1st CASE
AND 2015 <= DATEPART(Year,CreationDate) -- Copied from 2nd CASE
--
Und was ist mit dem Fall @periodo = '2' AND @fetcha NOT IN (13,14)
? Und was ist mit dem Fall @periodo = '3' AND @fetcha NOT IN (15)
?
Dieser Fall würde nicht existieren, es ist auf der Client-Seite beschränkt. Wenn sie @Periodo = '2'
wählen, dann haben @Fecha
Werte von 1 - 12 und sonst nichts.
Same mit @Periodo = '3'
dann @Fecha
haben Werte von 15 oder 16, beziehe beide bis 2015 oder 2016.
Mögliches Duplikat von [Bedingte Where-Klausel in Sql Server?] (Http://StackOverflow.com/questions/18629132/conditional-where-clause-in-sql-server) –
'UND @VPeriodo> = @VFecha AND @VPeriodo <= @ VFecha' huh ?? .. kannst du genauer angeben, was dein Problem ist? – JamieD77
@ JamieD77 Ich bekomme die Ergebnisse zwischen einem Zeitrahmen ('@ fechaInicio' und' @fechaFin') Wie auch immer die Benutzeranfrage (mit dem '@ Periodo' Parameter), muss ich die Ergebnisse von diesem TimeFrame bekommen, aber es könnte sein nach Monat, Semester oder Jahr, in '@ VPeriodo' speichere ich die gewünschte Zeitraffer (' DATEPART') in '@VFecha' es ist der Zeitrahmen, den ich brauche (dh wenn seine Monate seine 1 - 12 sind) – abichango