【问题标题】:Using an IF statement to decide which where clause to execute使用 IF 语句来决定执行哪个 where 子句
【发布时间】:2016-02-03 22:58:38
【问题描述】:

我正在使用 SQL Server 2008。我正在尝试根据 IF 语句来决定要运行哪个 WHERE 语句。这可能不是解决此问题的正确方法,老实说,我不确定。到目前为止,这是我的代码:

SELECT A.[ArTrnDetail].[Invoice]
      ,cast(A.[ArTrnDetail].[InvoiceDate] AS DATE) AS InvoiceDate
      ,A.[ArTrnDetail].[Branch]
      ,A.[ArTrnDetail].[Salesperson]
      ,rtrim(A.[ArTrnDetail].[Customer]) AS Customer
      ,rtrim(A.[ArTrnDetail].[StockCode]) AS StockCode
      ,A.[ArTrnDetail].[QtyInvoiced]
      ,A.[ArTrnDetail].[NetSalesValue]
      ,A.[ArTrnDetail].[SalesOrder]
      ,rtrim(A.[ArTrnDetail].[CustomerPoNumber]) AS CustomerPO
      ,cast(B.[EarliestSalesSeries].[InvoiceDate] as DATE) AS EarliestDate
      ,DATEADD(year, 1, B.[EarliestSalesSeries].[InvoiceDate]) as LatestDate
      ,A.[InvMaster].[Description]
      ,LEFT(A.[InvMaster].[UserField2], 3) AS SalesSeries
      ,DATEDIFF(DAY,B.[EarliestSalesSeries].[InvoiceDate], @enddate) as DateDifference	  
    FROM A.[ArTrnDetail]
    JOIN A.[InvMaster] ON A.[ArTrnDetail].StockCode
    = A.[InvMaster].[StockCode]
    JOIN B.[EarliestSalesSeries] ON A.[InvMaster].[UserField2]
    = B.[EarliestSalesSeries].SalesSeries

我在代码开头的 SELECT 之前定义了 @firstYearDay。

我需要这样做:

IF LatestDate > @enddate 然后运行这个 where 子句:

   WHERE (A.[ArTrnDetail].[InvoiceDate] between @firstYearDay and @enddate)
	AND (DATEDIFF(YEAR,B.[EarliestSalesSeries].[InvoiceDate], @enddate) < 1)

ELSE IF LatestDate

   WHERE (A.[ArTrnDetail].[InvoiceDate] between @firstYearDay and LatestDate)
	AND (DATEDIFF(YEAR, B.[EarliestSalesSeries].[InvoiceDate], @firstYearDay) < 1)

如果您需要更多信息,请告诉我。我是stackoverflow的新手,所以请问!感谢您的帮助。

【问题讨论】:

标签: sql-server sql-server-2008 tsql


【解决方案1】:

您可以在where 子句中使用CASE WHEN 来执行IF 逻辑。

   WHERE A.[ArTrnDetail].[InvoiceDate] >= @firstYearDay 
   AND A.[ArTrnDetail].[InvoiceDate] < DATEADD(d, 1 MIN(LatestDate, @enddate))
AND (DATEDIFF(YEAR,B.[EarliestSalesSeries].[InvoiceDate], CASE WHEN LatestDate > @endDate THEN @enddate ELSE @firstYearDay END) < 1)

对于第一个条件,我使用min 而不是CASE WHEN。你也可以在那里使用CASE WHEN

【讨论】:

  • Anup,由于某种原因,这似乎不起作用。我在遵循您使用的逻辑时遇到了麻烦。你介意解释一下吗?
  • 是给你错误还是它没有给你预期的结果?
  • 它给出了错误:'min' 附近的语法不正确,我尝试将 min 更改为 'case when',但它给出了错误:关键字'case' 附近的语法不正确。
  • 您需要使用DATEADD(year, 1, B.[EarliestSalesSeries].[InvoiceDate]) 而不是LatestDate。以上代码是总结Where子句中IF逻辑的实现方式。
【解决方案2】:

我相信我成功了。我让它变得比它需要的更复杂。我的回答如下:

WHERE			
			 (A.[ArTrnDetail].[InvoiceDate] < @enddate
			 and
			 A.[ArTrnDetail].[InvoiceDate] 
			 between @firstYearDay and DATEADD(year, 1, B.[EarliestSalesSeries].[InvoiceDate])
			 AND DATEDIFF(day, B.[EarliestSalesSeries].[InvoiceDate], @firstYearDay) < 365)
			 or
			 (A.[ArTrnDetail].[InvoiceDate] > @enddate
			 and
			 A.[ArTrnDetail].[InvoiceDate] between @firstYearDay and @enddate)
			 AND (DATEDIFF(DAY,B.[EarliestSalesSeries].[InvoiceDate], @enddate) < 365)
			 	

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多