Как использовать If else в предложении where запроса sql

Ниже моя хранимая процедура.

USE [CBRDev]
GO
/****** Object:  StoredProcedure [dbo].[usp_ExportData]    Script Date: 6/14/2017 12:48:44 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[usp_ExportData]
(
@StartDate Date,
@EndDate Date
)

AS
BEGIN
 Select REPLACE(U.EmployeeID, ',','') as EmployeeID,REPLACE(U.ClientID, ',','') as ClientID,REPLACE(U.ID, ',','') as ID,
 REPLACE(U.FirstName, ',','')as FirstName,REPLACE(U.MiddleName, ',','')as MiddleName,
 REPLACE(U.LastName, ',','')as LastName,REPLACE(U.Email, ',','')as Email,REPLACE(U.SSN, ',','')as SSN,
 REPLACE(U.DateOfBirth, ',','')as DateOfBirth,REPLACE(U.Gender, ',','')as Gender,REPLACE(U.CreatedDate, ',','')as CreatedDate,
REPLACE(U.ModifiedDate, ',','')as ModifiedDate, REPLACE(UPI.StreetAddress1, ',','')as StreetAddress1,
REPLACE(UPI.StreetAddress2, ',','')as StreetAddress2,REPLACE(UPI.City, ',','')as City,
REPLACE(UPI.State, ',','')as State,
REPLACE(UPI.ZipCode, ',','')as ZipCode,
REPLACE(UPI.CellPhoneNumber, ',','')as CellPhoneNumber, '' as Department, '' as JobTitle, '' as StreetAddress3 from Users U INNER JOIN PersonalContacts UPI ON U.ID= UPI.UserID
 where U.ModifiedDate >=@StartDate and U.ModifiedDate<= @EndDate
END

В котором, если параметр @StartDate и @EndDate имеет значение null, я хочу удалить условие where.

и если присутствуют параметры @StartDate и @EndDate, тогда примените условие where, тогда как я могу это сделать?


person sbm6070    schedule 14.06.2017    source источник
comment
Вы говорите, что если есть дата начала, должна быть дата окончания, иначе нет даты?   -  person maSTAShuFu    schedule 14.06.2017


Ответы (5)


Вы можете просто изменить условие WHERE:

where @StartDate IS NULL OR @EndDate IS NULL OR 
      U.ModifiedDate BETWEEN @StartDate AND @EndDate

Чтобы предотвратить обнюхивание параметров (один кешированный план выполнения, используемый для разных значений параметров), я предлагаю вам использовать подсказку перекомпиляции на уровне процедуры (WITH RECOMPILE) или запроса. OPTION (RECOMPILE);.

person Vojtěch Dohnal    schedule 14.06.2017
comment
.. просто помните об обнюхивании параметров в этом случае «необязательное где». - person Nick.McDermaid; 14.06.2017

попробуй это....

ALTER procedure [dbo].[usp_ExportData]
(
@StartDate Date,
@EndDate Date
)
AS
BEGIN
declare @sql varchar(max)
set @sql = ''
set @sql += ' Select REPLACE(U.EmployeeID, '','','') as 
EmployeeID,REPLACE(U.ClientID, '','','') as ClientID,REPLACE(U.ID, '','','') as ID,
REPLACE(U.FirstName, '','','')as FirstName,REPLACE(U.MiddleName, '','','')as MiddleName,
REPLACE(U.LastName, '','','')as LastName,REPLACE(U.Email, ',','')as 
Email,REPLACE(U.SSN, '','','')as SSN,
REPLACE(U.DateOfBirth, '','','')as DateOfBirth,REPLACE(U.Gender, '','','')as
Gender,REPLACE(U.CreatedDate, '','','')as CreatedDate,
REPLACE(U.ModifiedDate, '','','')as ModifiedDate, REPLACE(UPI.StreetAddress1,
 '','','')as StreetAddress1,
REPLACE(UPI.StreetAddress2, '','','')as StreetAddress2,REPLACE(UPI.City, '','','')as
 City,
REPLACE(UPI.State, '','','')as State,
REPLACE(UPI.ZipCode, '','','')as ZipCode,
REPLACE(UPI.CellPhoneNumber, '','','')as CellPhoneNumber, '' as Department, '' as 
JobTitle, '' as StreetAddress3 from Users U INNER JOIN PersonalContacts UPI ON
 U.ID= UPI.UserID'

if(@StartDate <> '' or @EndDate <> '')set @sql += ' where U.ModifiedDate >='''+@StartDate+''' and U.ModifiedDate<= '''+@EndDate+''''

exec(@sql)
END
person Nithin    schedule 14.06.2017

Я просто проверяю перед вызовом хранимой процедуры, является ли «TEMP_DATA_TABLE» нулевым или нет, если оно не равно нулю, а затем удаляет эту таблицу. И это работает.

USE [CBRDev]    
GO  
/****** Object:  StoredProcedure [dbo].[usp_ExportData] Script Date: 
6/14/2017 12:48:44 PM ******/
SET ANSI_NULLS ON  
GO  
SET QUOTED_IDENTIFIER ON  
GO  
ALTER procedure [dbo].[usp_ExportData]  
(
   @StartDate Date,
   @EndDate Date  
)

AS
BEGIN

if (select OBJECT_ID('TEMP_DATA_TABLE')) Is Not Null
Begin 
DROP Table TEMP_DATA_TABLE
end
Select REPLACE(U.EmployeeID, ',','') as EmployeeID,
REPLACE(U.ClientID, ',','') as ClientID, 
REPLACE(U.ID, ',','') as ID, REPLACE(U.FirstName, ',','')as FirstName, 
REPLACE(U.MiddleName, ',','')as MiddleName,
REPLACE(U.LastName, ',','')as LastName,
REPLACE(U.Email, ',','')as Email,REPLACE(U.SSN, ',','')as SSN,
REPLACE(U.DateOfBirth, ',','')as DateOfBirth,
REPLACE(U.Gender, ',','')as Gender,
REPLACE(U.CreatedDate, ',','')as CreatedDate,
REPLACE(U.ModifiedDate, ',','')as ModifiedDate, 
REPLACE(UPI.StreetAddress1, ',','')as StreetAddress1,
REPLACE(UPI.StreetAddress2, ',','')as StreetAddress2,
REPLACE(UPI.City, ',','')as City,
REPLACE(UPI.State, ',','')as State,
REPLACE(UPI.ZipCode, ',','')as ZipCode,
REPLACE(UPI.CellPhoneNumber, ',','')as CellPhoneNumber, '' as Department, '' 
as JobTitle, '' as StreetAddress3   
INTO TEMP_DATA_TABLE   
FROM Users U INNER JOIN PersonalContacts UPI ON U.ID= UPI.UserID  

IF (@StartDate IS NOT NULL AND @EndDate IS NOT NULL)  
  SELECT * FROM TEMP_DATA_TABLE 
  where ModifiedDate >=@StartDate and ModifiedDate<= @EndDate   
ELSE  
  SELECT * FROM TEMP_DATA_TABLE  
END
person sbm6070    schedule 14.06.2017

person    schedule
comment
выдает 2 ошибки. Строка 17: Неверный синтаксис рядом с ','. И Строка 49: — Выражение нелогического типа, указанное в контексте, где ожидается условие, рядом с «и». - person sbm6070; 14.06.2017

person    schedule
comment
он говорит, что в базе данных уже есть объект с именем «TEMP_TABLE». - person sbm6070; 14.06.2017
comment
вы можете попробовать изменить имя таблицы в зависимости от ваших предпочтений. - person user8158485; 14.06.2017
comment
Мой подход заключается в том, чтобы сохранить его во временной таблице #NEW_TABLE, а затем отфильтровать эту таблицу на основе указанных вами критериев. Надеюсь, что это работает :) - person user8158485; 14.06.2017
comment
@ user8158485 Это ленивый и неэффективный подход. Правильно реализованный дизайн динамического SQL лучше — см. erland - person SMor; 14.06.2017