我有一个查询,我需要从表中获取结果,具体取决于用户在vb.net页面上指定的参数。CASE里WHERE子句
声明一个变量将是理想的解决方案,但由于它是一个内联表值函数,我不能这样做,所以我已经阅读了其他问题,这在多表函数中是可能的,但是使用这种功能是不推荐的。
以下查询将是理想的解决方案或我想实现的目标。
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
AND 在先前的查询@fechaInicio,@fechaFin,@Periodo和@Fecha是由用户提供的参数。
基本上如果@Periodo = 0
我需要得到结果,其中 CreationDate>= @fechaInicio and CreationDate<[email protected]
如果@Periodo = 1
我需要在那里 DATEPART(MONTH,CreationDate)>= @Fecha and DATEPART(MONTH,CreationDate)<= @Fecha
等等的结果。 希望我明确表示感谢!
编辑利用@MatBailie伪代码,有些轻视的改变和回答他的问题
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
--
又是怎么回事的情况下@periodo = '2' AND @fetcha NOT IN (13,14)
? 那么情况如何@periodo = '3' AND @fetcha NOT IN (15)
?
这种情况将不存在,其限制在客户端。 如果他们选择@Periodo = '2'
那么@Fecha
将具有1-12的值,而没有其他值。
同样的,@Periodo = '3'
的15或再@Fecha
将有值16,既指的2015年或2016年
可能重复的[条件where子句在Sql Server?](http://stackoverflow.com/questions/18629132/conditional-where-clause-in-sql-server) –
和@VPeriodo> = @VFecha和@VPeriodo <= @ VFecha'呵呵..你能更具体地说明你的问题是什么吗? – JamieD77
@ JamieD77我在一个时间范围内获得结果('@ fechaInicio'和'@ fechaFin')但是,如果用户请求(使用'@ Periodo'参数),我需要从该TimeFrame获取结果,但它可能是在'@ VPeriodo'中,我存储了需要比较的时间间隔('DATEPART')in'@ VFecha',它是我需要的时间范围(即如果它的月份是1 - 12) – abichango