Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重写SQL而不重复参数_Sql - Fatal编程技术网

重写SQL而不重复参数

重写SQL而不重复参数,sql,Sql,我已经编写了下面的查询,但现在我想改进代码,最终的要求是不要重复任何参数两次。有没有一种方法可以在不影响逻辑的情况下重写此sql查询而不重复Flag1和Flag2参数 SELECT CASE WHEN @PARAM1 = 'REV' THEN SUM(NET_INVOICE_REVENUE) ELSE SUM(QUANTITY) END VAL FROM PA_TRANS TR JOIN PA_SOLD_TO CUST ON TR.SOLD_TO_CUSTOMER = CU

我已经编写了下面的查询,但现在我想改进代码,最终的要求是不要重复任何参数两次。有没有一种方法可以在不影响逻辑的情况下重写此sql查询而不重复Flag1和Flag2参数

SELECT 
CASE WHEN  @PARAM1 = 'REV' THEN SUM(NET_INVOICE_REVENUE) ELSE SUM(QUANTITY) END VAL 
FROM 
 PA_TRANS TR 
JOIN 
 PA_SOLD_TO CUST 
ON 
 TR.SOLD_TO_CUSTOMER = CUST.SOLD_TO_CUSTOMER 
WHERE  
 AGREEMENT_NBR = @AGREEMENT_CSV 
AND 
 PART_NUMBER = @PART_NUMBER 
AND 
 CUST.WW_CORP = CASE WHEN (@FLAG1 = 'N' AND @FLAG2 ='N') THEN @WW_CORP ELSE CUST.WW_CORP END 
AND 
 CUST.WW_AFFLIATE = CASE WHEN (@FLAG1 = 'N' AND @FLAG2 ='Y') THEN @WW_AFFLIATE ELSE       CUST.WW_AFFLIATE END 
AND  
   ( DAY >= @A_START_DATE AND  DAY < @A_END_DATE)
谢谢。
Mayurika

如果只想提及一次参数,可以使用CTE或子查询。以下是子查询表单:

SELECT (CASE WHEN p_PARAM1 = 'REV' THEN SUM(NET_INVOICE_REVENUE) ELSE SUM(QUANTITY)
        END) as VAL 
FROM (select @PARAM1 as p_param1, @AGREEMENT_CSV as p_AGREEMENT_CSV,
             @PART_NUMBER as p_PART_NUMBER, @FLAG1 as p_FLAG1, @FLAG2 as p_FLAG2,
             @A_START_DATE as p_A_START_DATE, @A_END_DATE as p_A_END_DATE
     ) params CROSS JOIN
     PA_TRANS TR JOIN
     PA_SOLD_TO CUST 
     ON  TR.SOLD_TO_CUSTOMER = CUST.SOLD_TO_CUSTOMER 
WHERE AGREEMENT_NBR = p_AGREEMENT_CSV AND 
      PART_NUMBER = p_PART_NUMBER AND 
      CUST.WW_CORP = CASE WHEN (p_FLAG1 = 'N' AND p_FLAG2 ='N') THEN @WW_CORP ELSE CUST.WW_CORP END AND 
      CUST.WW_AFFLIATE = CASE WHEN (p_FLAG1 = 'N' AND p_FLAG2 ='Y') THEN @WW_AFFLIATE ELSE       CUST.WW_AFFLIATE END AND  
      ( DAY >= p_A_START_DATE AND  DAY < p_A_END_DATE);

此问题似乎与主题无关,因为它是关于。您可以在子查询中使用FLAG1和FLAG2。。。。但是出于好奇,有两次有什么问题?有很多方法可以做到,但在这个例子中它们并不真正值得做。您不想重复这些参数的原因是什么?您使用的是什么数据库?谢谢大家。我在一个xml文件中使用这个查询,这个文件标识了什么?将符号标记为参数。我无法用名称映射此文件中传递的参数。每个默认情况下,mark在脚本中按顺序映射到我要传递的参数。谢谢Gordon。它解决了我的问题。