简体   繁体   English

如何在Oracle 11g r2中的存储过程的where子句中放置case语句

[英]how to put case statement in where clause in Stored procedure in oracle 11g r2

I am stuck in a problem.. I have searched it from net and found solution like this.. 我陷入了一个问题..我从网上搜索了它,发现了这样的解决方案..

SELECT B.ROW_ID INTO LOC_ROW_ID 
FROM
 (SELECT ROWNUM AS ROW_ID, 
                   A.YEAR, 
                   A.PERIOD 
  FROM
   (SELECT DISTINCT TP.YEAR, 
                    TP.MONTH
     FROM TB_PLAN TP
    WHERE
        ML_TYP=PARM_ML
        AND ANALYSIS_TYP=PARM_ANALYSIS_TYP
   **   AND CASE 
               WHEN PARM_TYP_ST IS NULL THEN PLAN_CDE 
               END=PARM_PLAN_CDE 
        AND CASE
                WHEN PARM_TYP_ST IN NOT NULL THEN PLAN_CDE
                END=PARM_PLAN_CDE     **
        ORDER BY YEAR DESC, MONTH DESC
     )A 
       )B
       WHERE
            B.YEAR=2013
            AND PERIOD=3;

Here PARM_ML, PARM_ANALYSIS_TYP, PARM_TYP_ST are parameter passed as input parameter. 在这里,PARM_ML,PARM_ANALYSIS_TYP,PARM_TYP_ST是作为输入参数传递的参数。 And LOC_ROW_ID is local parameter to fatch value of ROW_ID LOC_ROW_ID是ROW_ID的值的局部参数

 I dont know whether this is approach for my problem or not.  But not getting any            .    result from this query

what i want to do is..
using same query for two cases
    case1: when 
     ML_TYP=PARM_ML
     AND ANALYSIS_TYP=PARM_ANALYSIS_TYP
     AND PLAN_CDE =PARM_PLAN_CDE 

    case2: when
      ML_TYP=PARM_ML
      AND ANALYSIS_TYP=PARM_ANALYSIS_TYP

Am i going right or should go for another solution. 我是对的还是应该寻求其他解决方案。 Please suggest. 请提出建议。

Basic query is

SELECT DISTINCT TP.YEAR, 
                    TP.MONTH
     FROM TB_PLAN TP
    WHERE
        ML_TYP=PARM_ML
        AND ANALYSIS_TYP=PARM_ANALYSIS_TYP
   **   AND CASE 
               WHEN PARM_TYP_ST IS NULL THEN PLAN_CDE 
               END=PARM_PLAN_CDE 
        AND CASE
                WHEN PARM_TYP_ST IN NOT NULL THEN PLAN_CDE
                END=PARM_PLAN_CDE     **
        ORDER BY YEAR DESC, MONTH DESC

I think this is the logic you are looking for: 我认为这是您要寻找的逻辑:

WHERE ML_TYP = PARM_ML AND
      ANALYSIS_TYP = PARM_ANALYSIS_TYP AND
      (PARM_TYP_ST IS NOT NULL OR PLAN_CDE = PARM_PLAN_CDE)

This makes PARM_PLAN_CDE an optional parameter. 这使PARM_PLAN_CDE成为可选参数。 When NULL , it will not filter the data. 当为NULL ,将不过滤数据。

In general, where clauses are more readable without where clauses. 一般而言, where条款是没有更多可读where子句。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM